SDRAngel  4.11.5
Developer docs for <a href="https://github.com/f4exb/sdrangel">SDRangel<\a>, an Open Source Qt5 / OpenGL 3.0+ SDR and signal analyzer frontend to various hardware.
Classes | Public Member Functions | Static Public Attributes | Private Types | Private Slots | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
FreqTracker Class Reference

#include <freqtracker.h>

+ Inheritance diagram for FreqTracker:
+ Collaboration diagram for FreqTracker:

Classes

struct  MagSqLevelsStore
 
class  MsgConfigureChannelizer
 
class  MsgConfigureFreqTracker
 
class  MsgSampleRateNotification
 

Public Member Functions

 FreqTracker (DeviceAPI *deviceAPI)
 
 ~FreqTracker ()
 
virtual void destroy ()
 
virtual void feed (const SampleVector::const_iterator &begin, const SampleVector::const_iterator &end, bool po)
 
virtual void start ()
 
virtual void stop ()
 
virtual bool handleMessage (const Message &cmd)
 Processing of a message. Returns true if message has actually been processed. More...
 
virtual void getIdentifier (QString &id)
 
virtual void getTitle (QString &title)
 
virtual qint64 getCenterFrequency () const
 Applies to a default stream. More...
 
virtual QByteArray serialize () const
 
virtual bool deserialize (const QByteArray &data)
 
virtual int getNbSinkStreams () const
 
virtual int getNbSourceStreams () const
 
virtual qint64 getStreamCenterFrequency (int streamIndex, bool sinkElseSource) const
 
virtual int webapiSettingsGet (SWGSDRangel::SWGChannelSettings &response, QString &errorMessage)
 
virtual int webapiSettingsPutPatch (bool force, const QStringList &channelSettingsKeys, SWGSDRangel::SWGChannelSettings &response, QString &errorMessage)
 
virtual int webapiReportGet (SWGSDRangel::SWGChannelReport &response, QString &errorMessage)
 
uint32_t getSampleRate () const
 
double getMagSq () const
 
bool getSquelchOpen () const
 
bool getPllLocked () const
 
Real getFrequency () const
 
Real getAvgDeltaFreq () const
 
void getMagSqLevels (double &avg, double &peak, int &nbSamples)
 
- Public Member Functions inherited from BasebandSampleSink
 BasebandSampleSink ()
 
virtual ~BasebandSampleSink ()
 
MessageQueuegetInputMessageQueue ()
 Get the queue for asynchronous inbound communication. More...
 
virtual void setMessageQueueToGUI (MessageQueue *queue)
 
MessageQueuegetMessageQueueToGUI ()
 
- Public Member Functions inherited from ChannelAPI
 ChannelAPI (const QString &name, StreamType streamType)
 
virtual ~ChannelAPI ()
 
virtual void setName (const QString &name)
 
virtual const QString & getName () const
 
int getIndexInDeviceSet () const
 
void setIndexInDeviceSet (int indexInDeviceSet)
 
int getDeviceSetIndex () const
 
void setDeviceSetIndex (int deviceSetIndex)
 
DeviceAPIgetDeviceAPI ()
 
void setDeviceAPI (DeviceAPI *deviceAPI)
 
uint64_t getUID () const
 
StreamType getStreamType () const
 

Static Public Attributes

static const QString m_channelIdURI = "sdrangel.channel.freqtracker"
 
static const QString m_channelId = "FreqTracker"
 

Private Types

enum  RateState { RSInitialFill, RSRunning }
 

Private Slots

void networkManagerFinished (QNetworkReply *reply)
 
void tick ()
 

Private Member Functions

void applySettings (const FreqTrackerSettings &settings, bool force=false)
 
void applyChannelSettings (int inputSampleRate, int inputFrequencyOffset, bool force=false)
 
void setInterpolator ()
 
void configureChannelizer ()
 
void connectTimer ()
 
void disconnectTimer ()
 
void webapiFormatChannelSettings (SWGSDRangel::SWGChannelSettings &response, const FreqTrackerSettings &settings)
 
void webapiFormatChannelReport (SWGSDRangel::SWGChannelReport &response)
 
void webapiReverseSendSettings (QList< QString > &channelSettingsKeys, const FreqTrackerSettings &settings, bool force)
 
void processOneSample (Complex &ci)
 

Private Attributes

DeviceAPIm_deviceAPI
 
ThreadedBasebandSampleSinkm_threadedChannelizer
 
DownChannelizerm_channelizer
 
FreqTrackerSettings m_settings
 
uint32_t m_deviceSampleRate
 
int m_inputSampleRate
 
int m_inputFrequencyOffset
 
uint32_t m_channelSampleRate
 
bool m_running
 
NCOF m_nco
 
PhaseLockComplex m_pll
 
FreqLockComplex m_fll
 
Interpolator m_interpolator
 
Real m_interpolatorDistance
 
Real m_interpolatorDistanceRemain
 
fftfiltm_rrcFilter
 
Real m_squelchLevel
 
uint32_t m_squelchCount
 
bool m_squelchOpen
 
uint32_t m_squelchGate
 Squelch gate in samples. More...
 
double m_magsq
 
double m_magsqSum
 
double m_magsqPeak
 
int m_magsqCount
 
MagSqLevelsStore m_magSqLevelStore
 
MovingAverageUtil< Real, double, 16 > m_movingAverage
 
QNetworkAccessManager * m_networkManager
 
QNetworkRequest m_networkRequest
 
const QTimer * m_timer
 
bool m_timerConnected
 
uint32_t m_tickCount
 
int m_lastCorrAbs
 
Real m_avgDeltaFreq
 
QMutex m_settingsMutex
 

Static Private Attributes

static const int m_udpBlockSize = 512
 

Additional Inherited Members

- Public Types inherited from ChannelAPI
enum  StreamType { StreamSingleSink, StreamSingleSource, StreamMIMO }
 < This is the same enum as in PluginInterface More...
 
- Protected Slots inherited from BasebandSampleSink
void handleInputMessages ()
 
- Protected Attributes inherited from BasebandSampleSink
MessageQueue m_inputMessageQueue
 Queue for asynchronous inbound communication. More...
 
MessageQueuem_guiMessageQueue
 Input message queue to the GUI. More...
 

Detailed Description

Definition at line 49 of file freqtracker.h.

Member Enumeration Documentation

◆ RateState

enum FreqTracker::RateState
private
Enumerator
RSInitialFill 
RSRunning 

Definition at line 199 of file freqtracker.h.

Constructor & Destructor Documentation

◆ FreqTracker()

FreqTracker::FreqTracker ( DeviceAPI deviceAPI)

Definition at line 53 of file freqtracker.cpp.

References DeviceAPI::addChannelSink(), DeviceAPI::addChannelSinkAPI(), applyChannelSettings(), PhaseLockComplex::computeCoefficients(), DSPEngine::getMasterTimer(), DSPEngine::instance(), m_channelId, m_channelizer, m_channelSampleRate, m_deviceAPI, m_inputFrequencyOffset, m_inputSampleRate, m_magsq, m_networkManager, m_pll, FreqTrackerSettings::m_rfBandwidth, m_rrcFilter, m_settings, m_threadedChannelizer, m_timer, and networkManagerFinished().

53  :
55  m_deviceAPI(deviceAPI),
56  m_deviceSampleRate(48000),
57  m_inputSampleRate(48000),
59  m_channelSampleRate(48000),
60  m_running(false),
61  m_squelchOpen(false),
62  m_squelchGate(0),
63  m_magsqSum(0.0f),
64  m_magsqPeak(0.0f),
65  m_magsqCount(0),
66  m_timerConnected(false),
67  m_tickCount(0),
68  m_lastCorrAbs(0),
69  m_avgDeltaFreq(0.0),
70  m_settingsMutex(QMutex::Recursive)
71 {
72  setObjectName(m_channelId);
73 
74 #ifdef USE_INTERNAL_TIMER
75 #warning "Uses internal timer"
76  m_timer = new QTimer();
77  m_timer->start(50);
78 #else
80 #endif
81  m_magsq = 0.0;
82 
84  m_pll.computeCoefficients(0.002f, 0.5f, 10.0f); // bandwidth, damping factor, loop gain
86 
87  m_channelizer = new DownChannelizer(this);
91 
92  m_networkManager = new QNetworkAccessManager();
93  connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
94 }
fftfilt * m_rrcFilter
Definition: freqtracker.h:222
void addChannelSinkAPI(ChannelAPI *channelAPI, int streamIndex=0)
Definition: deviceapi.cpp:156
double m_magsqSum
Definition: freqtracker.h:229
bool m_timerConnected
Definition: freqtracker.h:241
ThreadedBasebandSampleSink * m_threadedChannelizer
Definition: freqtracker.h:205
QMutex m_settingsMutex
Definition: freqtracker.h:245
uint32_t m_deviceSampleRate
Definition: freqtracker.h:209
uint32_t m_squelchGate
Squelch gate in samples.
Definition: freqtracker.h:227
static const QString m_channelIdURI
Definition: freqtracker.h:185
static const QString m_channelId
Definition: freqtracker.h:186
static DSPEngine * instance()
Definition: dspengine.cpp:51
int m_magsqCount
Definition: freqtracker.h:231
double m_magsqPeak
Definition: freqtracker.h:230
int m_lastCorrAbs
Definition: freqtracker.h:243
int m_inputSampleRate
Definition: freqtracker.h:210
ChannelAPI(const QString &name, StreamType streamType)
Definition: channelapi.cpp:23
uint32_t m_tickCount
Definition: freqtracker.h:242
int m_inputFrequencyOffset
Definition: freqtracker.h:211
PhaseLockComplex m_pll
Definition: freqtracker.h:216
const QTimer * m_timer
Definition: freqtracker.h:240
bool m_running
Definition: freqtracker.h:213
Exposes a single sink stream (input, Rx)
Definition: channelapi.h:41
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
void addChannelSink(ThreadedBasebandSampleSink *sink, int streamIndex=0)
Add a channel sink (Rx)
Definition: deviceapi.cpp:118
Real m_avgDeltaFreq
Definition: freqtracker.h:244
void networkManagerFinished(QNetworkReply *reply)
bool m_squelchOpen
Definition: freqtracker.h:226
double m_magsq
Definition: freqtracker.h:228
void computeCoefficients(Real wn, Real zeta, Real K)
uint32_t m_channelSampleRate
Definition: freqtracker.h:212
DeviceAPI * m_deviceAPI
Definition: freqtracker.h:204
DownChannelizer * m_channelizer
Definition: freqtracker.h:206
QNetworkAccessManager * m_networkManager
Definition: freqtracker.h:237
const QTimer & getMasterTimer() const
Definition: dspengine.h:84
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force=false)
+ Here is the call graph for this function:

◆ ~FreqTracker()

FreqTracker::~FreqTracker ( )

Definition at line 96 of file freqtracker.cpp.

References disconnectTimer(), m_channelizer, m_deviceAPI, m_networkManager, m_rrcFilter, m_threadedChannelizer, m_timer, networkManagerFinished(), DeviceAPI::removeChannelSink(), and DeviceAPI::removeChannelSinkAPI().

97 {
99 #ifdef USE_INTERNAL_TIMER
100  m_timer->stop();
101  delete m_timer;
102 #endif
103  disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
104  delete m_networkManager;
107  delete m_threadedChannelizer;
108  delete m_channelizer;
109  delete m_rrcFilter;
110 }
fftfilt * m_rrcFilter
Definition: freqtracker.h:222
void removeChannelSinkAPI(ChannelAPI *channelAPI, int streamIndex=0)
Definition: deviceapi.cpp:163
ThreadedBasebandSampleSink * m_threadedChannelizer
Definition: freqtracker.h:205
const QTimer * m_timer
Definition: freqtracker.h:240
void removeChannelSink(ThreadedBasebandSampleSink *sink, int streamIndex=0)
Remove a channel sink (Rx)
Definition: deviceapi.cpp:127
void networkManagerFinished(QNetworkReply *reply)
DeviceAPI * m_deviceAPI
Definition: freqtracker.h:204
DownChannelizer * m_channelizer
Definition: freqtracker.h:206
QNetworkAccessManager * m_networkManager
Definition: freqtracker.h:237
void disconnectTimer()
+ Here is the call graph for this function:

Member Function Documentation

◆ applyChannelSettings()

void FreqTracker::applyChannelSettings ( int  inputSampleRate,
int  inputFrequencyOffset,
bool  force = false 
)
private

Definition at line 297 of file freqtracker.cpp.

References m_inputFrequencyOffset, m_inputSampleRate, m_nco, m_settings, FreqTrackerSettings::m_tracking, NCOF::setFreq(), and setInterpolator().

Referenced by FreqTracker(), handleMessage(), and start().

298 {
299  if (!m_settings.m_tracking) {
300  qDebug() << "FreqTracker::applyChannelSettings:"
301  << " inputSampleRate: " << inputSampleRate
302  << " inputFrequencyOffset: " << inputFrequencyOffset;
303  }
304 
305  if ((m_inputFrequencyOffset != inputFrequencyOffset) ||
306  (m_inputSampleRate != inputSampleRate) || force)
307  {
308  m_nco.setFreq(-inputFrequencyOffset, inputSampleRate);
309  }
310 
311  if ((m_inputSampleRate != inputSampleRate) || force) {
312  setInterpolator();
313  }
314 
315  m_inputSampleRate = inputSampleRate;
316  m_inputFrequencyOffset = inputFrequencyOffset;
317 }
void setInterpolator()
int m_inputSampleRate
Definition: freqtracker.h:210
int m_inputFrequencyOffset
Definition: freqtracker.h:211
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
void setFreq(Real freq, Real sampleRate)
Definition: ncof.cpp:51
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ applySettings()

void FreqTracker::applySettings ( const FreqTrackerSettings settings,
bool  force = false 
)
private

Definition at line 319 of file freqtracker.cpp.

References configureChannelizer(), connectTimer(), disconnectTimer(), FreqTrackerSettings::m_alphaEMA, m_avgDeltaFreq, m_fll, FreqTrackerSettings::m_inputFrequencyOffset, m_lastCorrAbs, FreqTrackerSettings::m_log2Decim, m_pll, FreqTrackerSettings::m_pllPskOrder, FreqTrackerSettings::m_reverseAPIAddress, FreqTrackerSettings::m_reverseAPIChannelIndex, FreqTrackerSettings::m_reverseAPIDeviceIndex, FreqTrackerSettings::m_reverseAPIPort, FreqTrackerSettings::m_rfBandwidth, FreqTrackerSettings::m_rgbColor, FreqTrackerSettings::m_rrc, FreqTrackerSettings::m_rrcRolloff, m_settings, FreqTrackerSettings::m_squelch, FreqTrackerSettings::m_squelchGate, m_squelchLevel, FreqTrackerSettings::m_title, FreqTrackerSettings::m_trackerType, FreqTrackerSettings::m_tracking, FreqTrackerSettings::m_useReverseAPI, CalcDb::powerFromdB(), FreqLockComplex::reset(), PhaseLockComplex::reset(), setInterpolator(), PhaseLockComplex::setPskOrder(), FreqTrackerSettings::TrackerFLL, FreqTrackerSettings::TrackerNone, FreqTrackerSettings::TrackerPLL, and webapiReverseSendSettings().

Referenced by handleMessage(), and tick().

320 {
321  if (!settings.m_tracking)
322  {
323  qDebug() << "FreqTracker::applySettings:"
324  << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
325  << " m_rfBandwidth: " << settings.m_rfBandwidth
326  << " m_log2Decim: " << settings.m_log2Decim
327  << " m_squelch: " << settings.m_squelch
328  << " m_rgbColor: " << settings.m_rgbColor
329  << " m_title: " << settings.m_title
330  << " m_alphaEMA: " << settings.m_alphaEMA
331  << " m_tracking: " << settings.m_tracking
332  << " m_trackerType: " << settings.m_trackerType
333  << " m_pllPskOrder: " << settings.m_pllPskOrder
334  << " m_rrc: " << settings.m_rrc
335  << " m_rrcRolloff: " << settings.m_rrcRolloff
336  << " m_useReverseAPI: " << settings.m_useReverseAPI
337  << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
338  << " m_reverseAPIPort: " << settings.m_reverseAPIPort
339  << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
340  << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
341  << " force: " << force;
342  }
343 
344  QList<QString> reverseAPIKeys;
345  bool updateChannelizer = false;
346  bool updateInterpolator = false;
347 
348  if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force)
349  {
350  reverseAPIKeys.append("inputFrequencyOffset");
351  updateChannelizer = true;
352  }
353 
354  if ((m_settings.m_log2Decim != settings.m_log2Decim) || force)
355  {
356  reverseAPIKeys.append("log2Decim");
357  updateChannelizer = true;
358  }
359 
360  if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || force)
361  {
362  updateInterpolator = true;
363  reverseAPIKeys.append("rfBandwidth");
364  }
365 
366  if ((m_settings.m_squelch != settings.m_squelch) || force)
367  {
369  reverseAPIKeys.append("squelch");
370  }
371 
372  if ((m_settings.m_rgbColor != settings.m_rgbColor) || force) {
373  reverseAPIKeys.append("rgbColor");
374  }
375  if ((m_settings.m_title != settings.m_title) || force) {
376  reverseAPIKeys.append("title");
377  }
378  if ((m_settings.m_alphaEMA != settings.m_alphaEMA) || force) {
379  reverseAPIKeys.append("alphaEMA");
380  }
381 
382  if ((m_settings.m_tracking != settings.m_tracking) || force)
383  {
384  reverseAPIKeys.append("tracking");
385  m_avgDeltaFreq = 0.0;
386  m_lastCorrAbs = 0;
387 
388  if (settings.m_tracking)
389  {
390  m_pll.reset();
391  m_fll.reset();
392  }
393  }
394 
395  if ((m_settings.m_trackerType != settings.m_trackerType) || force)
396  {
397  reverseAPIKeys.append("trackerType");
398  m_lastCorrAbs = 0;
399  m_avgDeltaFreq = 0.0;
400 
402  m_fll.reset();
403  } else if (settings.m_trackerType == FreqTrackerSettings::TrackerPLL) {
404  m_pll.reset();
405  }
406 
408  disconnectTimer();
409  } else {
410  connectTimer();
411  }
412  }
413 
414  if ((m_settings.m_pllPskOrder != settings.m_pllPskOrder) || force)
415  {
416  reverseAPIKeys.append("pllPskOrder");
417 
418  if (settings.m_pllPskOrder < 32) {
419  m_pll.setPskOrder(settings.m_pllPskOrder);
420  }
421  }
422 
423  if ((m_settings.m_rrc != settings.m_rrc) || force) {
424  reverseAPIKeys.append("rrc");
425  }
426  if ((m_settings.m_rrcRolloff != settings.m_rrcRolloff) || force)
427  {
428  reverseAPIKeys.append("rrcRolloff");
429  updateInterpolator = true;
430  }
431  if ((m_settings.m_squelchGate != settings.m_squelchGate) || force)
432  {
433  reverseAPIKeys.append("squelchGate");
434  updateInterpolator = true;
435  }
436 
437  if (settings.m_useReverseAPI)
438  {
439  bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
444  webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
445  }
446 
447  m_settings = settings;
448 
449  if (updateChannelizer) {
451  } else if (updateInterpolator) {
452  setInterpolator();
453  }
454 }
FreqLockComplex m_fll
Definition: freqtracker.h:217
int m_squelchGate
in 10s of ms
void setInterpolator()
int m_lastCorrAbs
Definition: freqtracker.h:243
Real m_squelchLevel
Definition: freqtracker.h:224
PhaseLockComplex m_pll
Definition: freqtracker.h:216
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
Real m_avgDeltaFreq
Definition: freqtracker.h:244
uint32_t m_rrcRolloff
in 100ths
void webapiReverseSendSettings(QList< QString > &channelSettingsKeys, const FreqTrackerSettings &settings, bool force)
void configureChannelizer()
void setPskOrder(unsigned int order)
static double powerFromdB(double powerdB)
Definition: db.cpp:36
float m_alphaEMA
alpha factor for delta frequency EMA
void disconnectTimer()
void connectTimer()
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ configureChannelizer()

void FreqTracker::configureChannelizer ( )
private

Definition at line 467 of file freqtracker.cpp.

References DownChannelizer::configure(), FreqTracker::MsgSampleRateNotification::create(), BasebandSampleSink::getInputMessageQueue(), m_channelizer, m_channelSampleRate, m_deviceSampleRate, m_fll, BasebandSampleSink::m_guiMessageQueue, FreqTrackerSettings::m_inputFrequencyOffset, FreqTrackerSettings::m_log2Decim, m_pll, m_settings, FreqTrackerSettings::m_tracking, MessageQueue::push(), FreqLockComplex::setSampleRate(), and PhaseLockComplex::setSampleRate().

Referenced by applySettings(), and handleMessage().

468 {
470  {
474  }
475 
476  if (!m_settings.m_tracking) {
477  qDebug() << "FreqTracker::configureChannelizer:"
478  << " sampleRate: " << m_channelSampleRate
479  << " inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset;
480  }
481 
485 
486  if (m_guiMessageQueue)
487  {
488  MsgSampleRateNotification *msg = MsgSampleRateNotification::create(
491  m_guiMessageQueue->push(msg);
492  }
493 }
void configure(MessageQueue *messageQueue, int sampleRate, int centerFrequency)
void push(Message *message, bool emitSignal=true)
Push message onto queue.
FreqLockComplex m_fll
Definition: freqtracker.h:217
MessageQueue * getInputMessageQueue()
Get the queue for asynchronous inbound communication.
static MsgSampleRateNotification * create(int sampleRate, int frequencyOffset)
Definition: freqtracker.h:102
uint32_t m_deviceSampleRate
Definition: freqtracker.h:209
MessageQueue * m_guiMessageQueue
Input message queue to the GUI.
PhaseLockComplex m_pll
Definition: freqtracker.h:216
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
uint32_t m_channelSampleRate
Definition: freqtracker.h:212
DownChannelizer * m_channelizer
Definition: freqtracker.h:206
void setSampleRate(unsigned int sampleRate)
void setSampleRate(unsigned int sampleRate)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ connectTimer()

void FreqTracker::connectTimer ( )
private

Definition at line 495 of file freqtracker.cpp.

References m_tickCount, m_timer, m_timerConnected, and tick().

Referenced by applySettings().

496 {
497  if (!m_timerConnected)
498  {
499  m_tickCount = 0;
500  connect(m_timer, SIGNAL(timeout()), this, SLOT(tick()));
501  m_timerConnected = true;
502  }
503 }
bool m_timerConnected
Definition: freqtracker.h:241
uint32_t m_tickCount
Definition: freqtracker.h:242
const QTimer * m_timer
Definition: freqtracker.h:240
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ deserialize()

bool FreqTracker::deserialize ( const QByteArray &  data)
virtual

Implements ChannelAPI.

Definition at line 519 of file freqtracker.cpp.

References FreqTracker::MsgConfigureFreqTracker::create(), FreqTrackerSettings::deserialize(), BasebandSampleSink::m_inputMessageQueue, m_settings, MessageQueue::push(), and FreqTrackerSettings::resetToDefaults().

Referenced by getCenterFrequency().

520 {
521  if (m_settings.deserialize(data))
522  {
523  MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(m_settings, true);
525  return true;
526  }
527  else
528  {
530  MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(m_settings, true);
532  return false;
533  }
534 }
void push(Message *message, bool emitSignal=true)
Push message onto queue.
MessageQueue m_inputMessageQueue
Queue for asynchronous inbound communication.
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
bool deserialize(const QByteArray &data)
static MsgConfigureFreqTracker * create(const FreqTrackerSettings &settings, bool force)
Definition: freqtracker.h:59
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ destroy()

virtual void FreqTracker::destroy ( )
inlinevirtual

Implements ChannelAPI.

Definition at line 122 of file freqtracker.h.

References feed(), handleMessage(), start(), and stop().

122 { delete this; }
+ Here is the call graph for this function:

◆ disconnectTimer()

void FreqTracker::disconnectTimer ( )
private

Definition at line 505 of file freqtracker.cpp.

References m_timer, m_timerConnected, and tick().

Referenced by applySettings(), and ~FreqTracker().

506 {
507  if (m_timerConnected)
508  {
509  disconnect(m_timer, SIGNAL(timeout()), this, SLOT(tick()));
510  m_timerConnected = false;
511  }
512 }
bool m_timerConnected
Definition: freqtracker.h:241
const QTimer * m_timer
Definition: freqtracker.h:240
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ feed()

void FreqTracker::feed ( const SampleVector::const_iterator &  begin,
const SampleVector::const_iterator &  end,
bool  po 
)
virtual

Implements BasebandSampleSink.

Definition at line 112 of file freqtracker.cpp.

References Interpolator::decimate(), Interpolator::interpolate(), m_interpolator, m_interpolatorDistance, m_interpolatorDistanceRemain, m_nco, m_running, m_settingsMutex, NCOF::nextIQ(), and processOneSample().

Referenced by destroy().

113 {
114  (void) firstOfBurst;
115  Complex ci;
116 
117  if (!m_running) {
118  return;
119  }
120 
121  m_settingsMutex.lock();
122 
123  for (SampleVector::const_iterator it = begin; it != end; ++it)
124  {
125  Complex c(it->real(), it->imag());
126  c *= m_nco.nextIQ();
127 
128  if (m_interpolatorDistance < 1.0f) // interpolate
129  {
130  processOneSample(ci);
131 
133  {
134  processOneSample(ci);
135  }
136 
138  }
139  else // decimate
140  {
142  {
143  processOneSample(ci);
145  }
146  }
147  }
148 
149  m_settingsMutex.unlock();
150 }
bool decimate(Real *distance, const Complex &next, Complex *result)
Definition: interpolator.h:38
bool interpolate(Real *distance, const Complex &next, Complex *result)
Definition: interpolator.h:53
QMutex m_settingsMutex
Definition: freqtracker.h:245
Complex nextIQ()
Return next complex sample.
Definition: ncof.cpp:63
Real m_interpolatorDistance
Definition: freqtracker.h:219
void processOneSample(Complex &ci)
bool m_running
Definition: freqtracker.h:213
Interpolator m_interpolator
Definition: freqtracker.h:218
Real m_interpolatorDistanceRemain
Definition: freqtracker.h:220
std::complex< Real > Complex
Definition: dsptypes.h:43
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getAvgDeltaFreq()

Real FreqTracker::getAvgDeltaFreq ( ) const
inline

Definition at line 165 of file freqtracker.h.

References m_avgDeltaFreq.

Referenced by FreqTrackerGUI::tick().

165 { return m_avgDeltaFreq; }
Real m_avgDeltaFreq
Definition: freqtracker.h:244
+ Here is the caller graph for this function:

◆ getCenterFrequency()

virtual qint64 FreqTracker::getCenterFrequency ( ) const
inlinevirtual

Applies to a default stream.

Implements ChannelAPI.

Definition at line 131 of file freqtracker.h.

References deserialize(), FreqTrackerSettings::m_inputFrequencyOffset, FreqTracker::MsgConfigureFreqTracker::m_settings, and serialize().

FreqTrackerSettings m_settings
Definition: freqtracker.h:207
+ Here is the call graph for this function:

◆ getFrequency()

Real FreqTracker::getFrequency ( ) const

Definition at line 242 of file freqtracker.cpp.

References FreqLockComplex::getFreq(), PhaseLockComplex::getFreq(), m_channelSampleRate, m_fll, M_PI, m_pll, m_settings, FreqTrackerSettings::m_trackerType, FreqTrackerSettings::TrackerFLL, and FreqTrackerSettings::TrackerPLL.

Referenced by getPllLocked(), and tick().

243 {
245  return (m_pll.getFreq() * m_channelSampleRate) / (2.0 * M_PI);
247  return (m_fll.getFreq() * m_channelSampleRate) / (2.0 * M_PI);
248  } else {
249  return 0;
250  }
251 }
FreqLockComplex m_fll
Definition: freqtracker.h:217
#define M_PI
Definition: rdsdemod.cpp:27
float getFreq() const
float getFreq() const
PhaseLockComplex m_pll
Definition: freqtracker.h:216
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
uint32_t m_channelSampleRate
Definition: freqtracker.h:212
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getIdentifier()

virtual void FreqTracker::getIdentifier ( QString &  id)
inlinevirtual

Implements ChannelAPI.

Definition at line 129 of file freqtracker.h.

129 { id = objectName(); }

◆ getMagSq()

double FreqTracker::getMagSq ( ) const
inline

Definition at line 161 of file freqtracker.h.

References m_magsq.

161 { return m_magsq; }
double m_magsq
Definition: freqtracker.h:228

◆ getMagSqLevels()

void FreqTracker::getMagSqLevels ( double &  avg,
double &  peak,
int &  nbSamples 
)
inline

Definition at line 167 of file freqtracker.h.

References FreqTracker::MagSqLevelsStore::m_magsq, m_magsq, m_magsqCount, m_magSqLevelStore, FreqTracker::MagSqLevelsStore::m_magsqPeak, m_magsqPeak, and m_magsqSum.

Referenced by FreqTrackerGUI::tick(), and webapiFormatChannelReport().

168  {
169  if (m_magsqCount > 0)
170  {
174  }
175 
178  nbSamples = m_magsqCount == 0 ? 1 : m_magsqCount;
179 
180  m_magsqSum = 0.0f;
181  m_magsqPeak = 0.0f;
182  m_magsqCount = 0;
183  }
double m_magsqSum
Definition: freqtracker.h:229
int m_magsqCount
Definition: freqtracker.h:231
double m_magsqPeak
Definition: freqtracker.h:230
MagSqLevelsStore m_magSqLevelStore
Definition: freqtracker.h:232
double m_magsq
Definition: freqtracker.h:228
+ Here is the caller graph for this function:

◆ getNbSinkStreams()

virtual int FreqTracker::getNbSinkStreams ( ) const
inlinevirtual

Implements ChannelAPI.

Definition at line 136 of file freqtracker.h.

136 { return 1; }

◆ getNbSourceStreams()

virtual int FreqTracker::getNbSourceStreams ( ) const
inlinevirtual

Implements ChannelAPI.

Definition at line 137 of file freqtracker.h.

137 { return 0; }

◆ getPllLocked()

bool FreqTracker::getPllLocked ( ) const
inline

Definition at line 163 of file freqtracker.h.

References getFrequency(), PhaseLockComplex::locked(), m_pll, FreqTracker::MsgConfigureFreqTracker::m_settings, FreqTrackerSettings::m_trackerType, and FreqTrackerSettings::TrackerPLL.

Referenced by FreqTrackerGUI::tick().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getSampleRate()

uint32_t FreqTracker::getSampleRate ( ) const
inline

Definition at line 160 of file freqtracker.h.

References m_channelSampleRate.

160 { return m_channelSampleRate; }
uint32_t m_channelSampleRate
Definition: freqtracker.h:212

◆ getSquelchOpen()

bool FreqTracker::getSquelchOpen ( ) const
inline

Definition at line 162 of file freqtracker.h.

References m_squelchOpen.

Referenced by FreqTrackerGUI::tick(), and tick().

162 { return m_squelchOpen; }
bool m_squelchOpen
Definition: freqtracker.h:226
+ Here is the caller graph for this function:

◆ getStreamCenterFrequency()

virtual qint64 FreqTracker::getStreamCenterFrequency ( int  streamIndex,
bool  sinkElseSource 
) const
inlinevirtual

Implements ChannelAPI.

Definition at line 139 of file freqtracker.h.

References FreqTrackerSettings::m_inputFrequencyOffset, FreqTracker::MsgConfigureFreqTracker::m_settings, webapiReportGet(), webapiSettingsGet(), and webapiSettingsPutPatch().

140  {
141  (void) streamIndex;
142  (void) sinkElseSource;
144  }
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
+ Here is the call graph for this function:

◆ getTitle()

virtual void FreqTracker::getTitle ( QString &  title)
inlinevirtual

Implements ChannelAPI.

Definition at line 130 of file freqtracker.h.

References FreqTracker::MsgConfigureFreqTracker::m_settings, and FreqTrackerSettings::m_title.

130 { title = m_settings.m_title; }
FreqTrackerSettings m_settings
Definition: freqtracker.h:207

◆ handleMessage()

bool FreqTracker::handleMessage ( const Message cmd)
virtual

Processing of a message. Returns true if message has actually been processed.

Implements BasebandSampleSink.

Definition at line 253 of file freqtracker.cpp.

References applyChannelSettings(), applySettings(), configureChannelizer(), DSPSignalNotification::getCenterFrequency(), FreqTracker::MsgConfigureFreqTracker::getForce(), DownChannelizer::MsgChannelizerNotification::getFrequencyOffset(), DownChannelizer::MsgChannelizerNotification::getSampleRate(), DSPSignalNotification::getSampleRate(), FreqTracker::MsgConfigureFreqTracker::getSettings(), m_deviceSampleRate, m_settings, FreqTrackerSettings::m_tracking, Message::match(), and setInterpolator().

Referenced by destroy().

254 {
256  {
259 
260  qDebug() << "FreqTracker::handleMessage: DSPSignalNotification:"
261  << " m_deviceSampleRate: " << m_deviceSampleRate
262  << " centerFrequency: " << notif.getCenterFrequency();
263 
265 
266  return true;
267  }
269  {
271 
272  if (!m_settings.m_tracking) {
273  qDebug() << "FreqTracker::handleMessage: MsgChannelizerNotification:"
274  << " inputSampleRate: " << notif.getSampleRate()
275  << " inputFrequencyOffset: " << notif.getFrequencyOffset();
276  }
277 
279  setInterpolator();
280 
281  return true;
282  }
283  else if (MsgConfigureFreqTracker::match(cmd))
284  {
285  MsgConfigureFreqTracker& cfg = (MsgConfigureFreqTracker&) cmd;
286  qDebug() << "FreqTracker::handleMessage: MsgConfigureFreqTracker";
287  applySettings(cfg.getSettings(), cfg.getForce());
288 
289  return true;
290  }
291  else
292  {
293  return false;
294  }
295 }
void applySettings(const FreqTrackerSettings &settings, bool force=false)
void setInterpolator()
uint32_t m_deviceSampleRate
Definition: freqtracker.h:209
qint64 getCenterFrequency() const
Definition: dspcommands.h:329
static bool match(const Message *message)
Definition: message.cpp:45
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
int getSampleRate() const
Definition: dspcommands.h:328
void configureChannelizer()
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force=false)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ networkManagerFinished

void FreqTracker::networkManagerFinished ( QNetworkReply *  reply)
privateslot

Definition at line 738 of file freqtracker.cpp.

Referenced by FreqTracker(), and ~FreqTracker().

739 {
740  QNetworkReply::NetworkError replyError = reply->error();
741 
742  if (replyError)
743  {
744  qWarning() << "FreqTracker::networkManagerFinished:"
745  << " error(" << (int) replyError
746  << "): " << replyError
747  << ": " << reply->errorString();
748  return;
749  }
750 
751  QString answer = reply->readAll();
752  answer.chop(1); // remove last \n
753  qDebug("FreqTracker::networkManagerFinished: reply:\n%s", answer.toStdString().c_str());
754 }
+ Here is the caller graph for this function:

◆ processOneSample()

void FreqTracker::processOneSample ( Complex ci)
private

Definition at line 152 of file freqtracker.cpp.

References MovingAverageUtil< T, Total, N >::asDouble(), FreqLockComplex::feed(), PhaseLockComplex::feed(), i, m_fll, m_magsq, m_magsqCount, m_magsqPeak, m_magsqSum, m_movingAverage, m_pll, FreqTrackerSettings::m_rrc, m_rrcFilter, m_settings, m_squelchCount, m_squelchGate, m_squelchLevel, m_squelchOpen, FreqTrackerSettings::m_trackerType, fftfilt::runFilt(), SDR_RX_SCALEF, FreqTrackerSettings::TrackerFLL, and FreqTrackerSettings::TrackerPLL.

Referenced by feed().

153 {
154  fftfilt::cmplx *sideband;
155  int n_out;
156 
157  if (m_settings.m_rrc)
158  {
159  n_out = m_rrcFilter->runFilt(ci, &sideband);
160  }
161  else
162  {
163  n_out = 1;
164  sideband = &ci;
165  }
166 
167  for (int i = 0; i < n_out; i++)
168  {
169  Real re = sideband[i].real() / SDR_RX_SCALEF;
170  Real im = sideband[i].imag() / SDR_RX_SCALEF;
171  Real magsq = re*re + im*im;
172  m_movingAverage(magsq);
174  m_magsqSum += magsq;
175 
176  if (magsq > m_magsqPeak)
177  {
178  m_magsqPeak = magsq;
179  }
180 
181  m_magsqCount++;
182 
183  if (m_magsq < m_squelchLevel)
184  {
185  if (m_squelchGate > 0)
186  {
187  if (m_squelchCount > 0) {
188  m_squelchCount--;
189  }
190 
192  }
193  else
194  {
195  m_squelchOpen = false;
196  }
197  }
198  else
199  {
200  if (m_squelchGate > 0)
201  {
202  if (m_squelchCount < 2*m_squelchGate) {
203  m_squelchCount++;
204  }
205 
207  }
208  else
209  {
210  m_squelchOpen = true;
211  }
212  }
213 
214  if (m_squelchOpen)
215  {
217  {
218  m_fll.feed(re, im);
219  }
221  {
222  m_pll.feed(re, im);
223  }
224  }
225  }
226 }
uint32_t m_squelchCount
Definition: freqtracker.h:225
fftfilt * m_rrcFilter
Definition: freqtracker.h:222
FreqLockComplex m_fll
Definition: freqtracker.h:217
double m_magsqSum
Definition: freqtracker.h:229
int runFilt(const cmplx &in, cmplx **out)
Definition: fftfilt.cpp:260
std::complex< float > cmplx
Definition: fftfilt.h:21
#define SDR_RX_SCALEF
Definition: dsptypes.h:33
uint32_t m_squelchGate
Squelch gate in samples.
Definition: freqtracker.h:227
MovingAverageUtil< Real, double, 16 > m_movingAverage
Definition: freqtracker.h:234
int m_magsqCount
Definition: freqtracker.h:231
double m_magsqPeak
Definition: freqtracker.h:230
int32_t i
Definition: decimators.h:244
Real m_squelchLevel
Definition: freqtracker.h:224
PhaseLockComplex m_pll
Definition: freqtracker.h:216
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
bool m_squelchOpen
Definition: freqtracker.h:226
void feed(float re, float im)
double m_magsq
Definition: freqtracker.h:228
double asDouble() const
Definition: movingaverage.h:57
float Real
Definition: dsptypes.h:42
void feed(float re, float im)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ serialize()

QByteArray FreqTracker::serialize ( ) const
virtual

Implements ChannelAPI.

Definition at line 514 of file freqtracker.cpp.

References m_settings, and FreqTrackerSettings::serialize().

Referenced by getCenterFrequency().

515 {
516  return m_settings.serialize();
517 }
QByteArray serialize() const
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setInterpolator()

void FreqTracker::setInterpolator ( )
private

Definition at line 456 of file freqtracker.cpp.

References Interpolator::create(), fftfilt::create_rrc_filter(), m_channelSampleRate, m_inputSampleRate, m_interpolator, m_interpolatorDistance, m_interpolatorDistanceRemain, FreqTrackerSettings::m_rfBandwidth, m_rrcFilter, FreqTrackerSettings::m_rrcRolloff, m_settings, m_settingsMutex, FreqTrackerSettings::m_squelchGate, and m_squelchGate.

Referenced by applyChannelSettings(), applySettings(), and handleMessage().

457 {
458  m_settingsMutex.lock();
463  m_squelchGate = (m_channelSampleRate / 100) * m_settings.m_squelchGate; // gate is given in 10s of ms at channel sample rate
464  m_settingsMutex.unlock();
465 }
fftfilt * m_rrcFilter
Definition: freqtracker.h:222
void create(int phaseSteps, double sampleRate, double cutoff, double nbTapsPerPhase=4.5)
int m_squelchGate
in 10s of ms
QMutex m_settingsMutex
Definition: freqtracker.h:245
uint32_t m_squelchGate
Squelch gate in samples.
Definition: freqtracker.h:227
Real m_interpolatorDistance
Definition: freqtracker.h:219
int m_inputSampleRate
Definition: freqtracker.h:210
Interpolator m_interpolator
Definition: freqtracker.h:218
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
void create_rrc_filter(float fb, float a)
root raised cosine. fb is half the band pass
Definition: fftfilt.cpp:222
uint32_t m_rrcRolloff
in 100ths
Real m_interpolatorDistanceRemain
Definition: freqtracker.h:220
uint32_t m_channelSampleRate
Definition: freqtracker.h:212
float Real
Definition: dsptypes.h:42
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ start()

void FreqTracker::start ( )
virtual

Implements BasebandSampleSink.

Definition at line 228 of file freqtracker.cpp.

References applyChannelSettings(), m_inputFrequencyOffset, m_inputSampleRate, m_running, and m_squelchCount.

Referenced by destroy().

229 {
230  qDebug("FreqTracker::start");
231  m_squelchCount = 0;
233  m_running = true;
234 }
uint32_t m_squelchCount
Definition: freqtracker.h:225
int m_inputSampleRate
Definition: freqtracker.h:210
int m_inputFrequencyOffset
Definition: freqtracker.h:211
bool m_running
Definition: freqtracker.h:213
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force=false)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ stop()

void FreqTracker::stop ( )
virtual

Implements BasebandSampleSink.

Definition at line 236 of file freqtracker.cpp.

References m_running.

Referenced by destroy().

237 {
238  qDebug("FreqTracker::stop");
239  m_running = false;
240 }
bool m_running
Definition: freqtracker.h:213
+ Here is the caller graph for this function:

◆ tick

void FreqTracker::tick ( )
privateslot

Definition at line 756 of file freqtracker.cpp.

References applySettings(), getFrequency(), getSquelchOpen(), FreqTrackerSettings::m_alphaEMA, m_avgDeltaFreq, m_channelSampleRate, FreqTrackerSettings::m_inputFrequencyOffset, m_lastCorrAbs, m_settings, m_tickCount, and FreqTrackerSettings::m_tracking.

Referenced by connectTimer(), and disconnectTimer().

757 {
758  if (getSquelchOpen()) {
760  }
761 
762  if (m_tickCount < 9)
763  {
764  m_tickCount++;
765  }
766  else
767  {
769  {
770  uint32_t decayDivider = 200.0 * m_settings.m_alphaEMA;
771  int decayAmount = m_channelSampleRate < decayDivider ? 1 : m_channelSampleRate / decayDivider;
772  int trim = m_channelSampleRate / 1000;
773 
774  if (m_lastCorrAbs < decayAmount)
775  {
777 
778  if (m_lastCorrAbs > trim)
779  {
780  FreqTrackerSettings settings = m_settings;
782  applySettings(settings);
783  }
784  }
785  else
786  {
787  m_lastCorrAbs -= decayAmount;
788  }
789  }
790 
791  m_tickCount = 0;
792  }
793 }
void applySettings(const FreqTrackerSettings &settings, bool force=false)
unsigned int uint32_t
Definition: rtptypes_win.h:46
int m_lastCorrAbs
Definition: freqtracker.h:243
uint32_t m_tickCount
Definition: freqtracker.h:242
bool getSquelchOpen() const
Definition: freqtracker.h:162
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
Real m_avgDeltaFreq
Definition: freqtracker.h:244
uint32_t m_channelSampleRate
Definition: freqtracker.h:212
Real getFrequency() const
float m_alphaEMA
alpha factor for delta frequency EMA
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ webapiFormatChannelReport()

void FreqTracker::webapiFormatChannelReport ( SWGSDRangel::SWGChannelReport response)
private

Definition at line 676 of file freqtracker.cpp.

References CalcDb::dbPower(), SWGSDRangel::SWGChannelReport::getFreqTrackerReport(), getMagSqLevels(), m_channelSampleRate, m_inputSampleRate, m_squelchOpen, SWGSDRangel::SWGFreqTrackerReport::setChannelPowerDb(), SWGSDRangel::SWGFreqTrackerReport::setChannelSampleRate(), SWGSDRangel::SWGFreqTrackerReport::setSampleRate(), and SWGSDRangel::SWGFreqTrackerReport::setSquelch().

Referenced by webapiReportGet().

677 {
678  double magsqAvg, magsqPeak;
679  int nbMagsqSamples;
680  getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples);
681 
683  response.getFreqTrackerReport()->setSquelch(m_squelchOpen ? 1 : 0);
686 }
static double dbPower(double magsq, double floor=1e-12)
Definition: db.cpp:22
SWGFreqTrackerReport * getFreqTrackerReport()
void getMagSqLevels(double &avg, double &peak, int &nbSamples)
Definition: freqtracker.h:167
int m_inputSampleRate
Definition: freqtracker.h:210
bool m_squelchOpen
Definition: freqtracker.h:226
void setChannelPowerDb(float channel_power_db)
uint32_t m_channelSampleRate
Definition: freqtracker.h:212
void setChannelSampleRate(qint32 channel_sample_rate)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ webapiFormatChannelSettings()

void FreqTracker::webapiFormatChannelSettings ( SWGSDRangel::SWGChannelSettings response,
const FreqTrackerSettings settings 
)
private

Definition at line 642 of file freqtracker.cpp.

References SWGSDRangel::SWGChannelSettings::getFreqTrackerSettings(), SWGSDRangel::SWGFreqTrackerSettings::getReverseApiAddress(), SWGSDRangel::SWGFreqTrackerSettings::getTitle(), FreqTrackerSettings::m_alphaEMA, FreqTrackerSettings::m_inputFrequencyOffset, FreqTrackerSettings::m_log2Decim, FreqTrackerSettings::m_pllPskOrder, FreqTrackerSettings::m_reverseAPIAddress, FreqTrackerSettings::m_reverseAPIChannelIndex, FreqTrackerSettings::m_reverseAPIDeviceIndex, FreqTrackerSettings::m_reverseAPIPort, FreqTrackerSettings::m_rfBandwidth, FreqTrackerSettings::m_rgbColor, FreqTrackerSettings::m_rrc, FreqTrackerSettings::m_rrcRolloff, m_settings, FreqTrackerSettings::m_squelch, FreqTrackerSettings::m_squelchGate, FreqTrackerSettings::m_title, FreqTrackerSettings::m_trackerType, FreqTrackerSettings::m_tracking, FreqTrackerSettings::m_useReverseAPI, SWGSDRangel::SWGFreqTrackerSettings::setAlphaEma(), SWGSDRangel::SWGFreqTrackerSettings::setInputFrequencyOffset(), SWGSDRangel::SWGFreqTrackerSettings::setLog2Decim(), SWGSDRangel::SWGFreqTrackerSettings::setPllPskOrder(), SWGSDRangel::SWGFreqTrackerSettings::setReverseApiAddress(), SWGSDRangel::SWGFreqTrackerSettings::setReverseApiChannelIndex(), SWGSDRangel::SWGFreqTrackerSettings::setReverseApiDeviceIndex(), SWGSDRangel::SWGFreqTrackerSettings::setReverseApiPort(), SWGSDRangel::SWGFreqTrackerSettings::setRfBandwidth(), SWGSDRangel::SWGFreqTrackerSettings::setRgbColor(), SWGSDRangel::SWGFreqTrackerSettings::setRrc(), SWGSDRangel::SWGFreqTrackerSettings::setRrcRolloff(), SWGSDRangel::SWGFreqTrackerSettings::setSquelch(), SWGSDRangel::SWGFreqTrackerSettings::setSquelchGate(), SWGSDRangel::SWGFreqTrackerSettings::setTitle(), SWGSDRangel::SWGFreqTrackerSettings::setTrackerType(), SWGSDRangel::SWGFreqTrackerSettings::setTracking(), and SWGSDRangel::SWGFreqTrackerSettings::setUseReverseApi().

Referenced by webapiSettingsGet(), and webapiSettingsPutPatch().

643 {
646  response.getFreqTrackerSettings()->setLog2Decim(settings.m_log2Decim);
647  response.getFreqTrackerSettings()->setSquelch(settings.m_squelch);
648  response.getFreqTrackerSettings()->setRgbColor(settings.m_rgbColor);
649 
650  if (response.getFreqTrackerSettings()->getTitle()) {
651  *response.getFreqTrackerSettings()->getTitle() = settings.m_title;
652  } else {
653  response.getFreqTrackerSettings()->setTitle(new QString(settings.m_title));
654  }
655 
660  response.getFreqTrackerSettings()->setRrc(m_settings.m_rrc ? 1 : 0);
663  response.getFreqTrackerSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
664 
665  if (response.getFreqTrackerSettings()->getReverseApiAddress()) {
667  } else {
668  response.getFreqTrackerSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
669  }
670 
674 }
void setUseReverseApi(qint32 use_reverse_api)
void setReverseApiChannelIndex(qint32 reverse_api_channel_index)
int m_squelchGate
in 10s of ms
SWGFreqTrackerSettings * getFreqTrackerSettings()
void setReverseApiPort(qint32 reverse_api_port)
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
uint32_t m_rrcRolloff
in 100ths
void setReverseApiAddress(QString *reverse_api_address)
void setReverseApiDeviceIndex(qint32 reverse_api_device_index)
float m_alphaEMA
alpha factor for delta frequency EMA
void setInputFrequencyOffset(qint64 input_frequency_offset)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ webapiReportGet()

int FreqTracker::webapiReportGet ( SWGSDRangel::SWGChannelReport response,
QString &  errorMessage 
)
virtual

Reimplemented from ChannelAPI.

Definition at line 631 of file freqtracker.cpp.

References SWGSDRangel::SWGChannelReport::getFreqTrackerReport(), SWGSDRangel::SWGFreqTrackerReport::init(), SWGSDRangel::SWGChannelReport::setFreqTrackerReport(), and webapiFormatChannelReport().

Referenced by getStreamCenterFrequency().

634 {
635  (void) errorMessage;
637  response.getFreqTrackerReport()->init();
638  webapiFormatChannelReport(response);
639  return 200;
640 }
void setFreqTrackerReport(SWGFreqTrackerReport *freq_tracker_report)
SWGFreqTrackerReport * getFreqTrackerReport()
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport &response)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ webapiReverseSendSettings()

void FreqTracker::webapiReverseSendSettings ( QList< QString > &  channelSettingsKeys,
const FreqTrackerSettings settings,
bool  force 
)
private

Definition at line 688 of file freqtracker.cpp.

References SWGSDRangel::SWGChannelSettings::asJson(), ChannelAPI::getDeviceSetIndex(), SWGSDRangel::SWGChannelSettings::getFreqTrackerSettings(), ChannelAPI::getIndexInDeviceSet(), FreqTrackerSettings::m_inputFrequencyOffset, m_networkManager, m_networkRequest, FreqTrackerSettings::m_reverseAPIAddress, FreqTrackerSettings::m_reverseAPIChannelIndex, FreqTrackerSettings::m_reverseAPIDeviceIndex, FreqTrackerSettings::m_reverseAPIPort, FreqTrackerSettings::m_rfBandwidth, FreqTrackerSettings::m_rgbColor, FreqTrackerSettings::m_squelch, FreqTrackerSettings::m_title, FreqTrackerSettings::m_trackerType, SWGSDRangel::SWGChannelSettings::setChannelType(), SWGSDRangel::SWGChannelSettings::setDirection(), SWGSDRangel::SWGChannelSettings::setFreqTrackerSettings(), SWGSDRangel::SWGFreqTrackerSettings::setInputFrequencyOffset(), SWGSDRangel::SWGChannelSettings::setOriginatorChannelIndex(), SWGSDRangel::SWGChannelSettings::setOriginatorDeviceSetIndex(), SWGSDRangel::SWGFreqTrackerSettings::setRfBandwidth(), SWGSDRangel::SWGFreqTrackerSettings::setRgbColor(), SWGSDRangel::SWGFreqTrackerSettings::setSquelch(), SWGSDRangel::SWGFreqTrackerSettings::setTitle(), and SWGSDRangel::SWGFreqTrackerSettings::setTrackerType().

Referenced by applySettings().

689 {
691  swgChannelSettings->setDirection(0); // single sink (Rx)
692  swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
693  swgChannelSettings->setOriginatorDeviceSetIndex(getDeviceSetIndex());
694  swgChannelSettings->setChannelType(new QString("FreqTracker"));
696  SWGSDRangel::SWGFreqTrackerSettings *swgFreqTrackerSettings = swgChannelSettings->getFreqTrackerSettings();
697 
698  // transfer data that has been modified. When force is on transfer all data except reverse API data
699 
700  if (channelSettingsKeys.contains("inputFrequencyOffset") || force) {
701  swgFreqTrackerSettings->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
702  }
703  if (channelSettingsKeys.contains("rfBandwidth") || force) {
704  swgFreqTrackerSettings->setRfBandwidth(settings.m_rfBandwidth);
705  }
706  if (channelSettingsKeys.contains("rgbColor") || force) {
707  swgFreqTrackerSettings->setRgbColor(settings.m_rgbColor);
708  }
709  if (channelSettingsKeys.contains("squelch") || force) {
710  swgFreqTrackerSettings->setSquelch(settings.m_squelch);
711  }
712  if (channelSettingsKeys.contains("title") || force) {
713  swgFreqTrackerSettings->setTitle(new QString(settings.m_title));
714  }
715  if (channelSettingsKeys.contains("trackerType") || force) {
716  swgFreqTrackerSettings->setTrackerType((int) settings.m_trackerType);
717  }
718 
719  QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
720  .arg(settings.m_reverseAPIAddress)
721  .arg(settings.m_reverseAPIPort)
722  .arg(settings.m_reverseAPIDeviceIndex)
723  .arg(settings.m_reverseAPIChannelIndex);
724  m_networkRequest.setUrl(QUrl(channelSettingsURL));
725  m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
726 
727  QBuffer *buffer=new QBuffer();
728  buffer->open((QBuffer::ReadWrite));
729  buffer->write(swgChannelSettings->asJson().toUtf8());
730  buffer->seek(0);
731 
732  // Always use PATCH to avoid passing reverse API settings
733  m_networkManager->sendCustomRequest(m_networkRequest, "PATCH", buffer);
734 
735  delete swgChannelSettings;
736 }
void setOriginatorChannelIndex(qint32 originator_channel_index)
int getDeviceSetIndex() const
Definition: channelapi.h:89
SWGFreqTrackerSettings * getFreqTrackerSettings()
void setChannelType(QString *channel_type)
void setOriginatorDeviceSetIndex(qint32 originator_device_set_index)
virtual QString asJson() override
void setFreqTrackerSettings(SWGFreqTrackerSettings *freq_tracker_settings)
int getIndexInDeviceSet() const
Definition: channelapi.h:87
QNetworkAccessManager * m_networkManager
Definition: freqtracker.h:237
QNetworkRequest m_networkRequest
Definition: freqtracker.h:238
void setInputFrequencyOffset(qint64 input_frequency_offset)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ webapiSettingsGet()

int FreqTracker::webapiSettingsGet ( SWGSDRangel::SWGChannelSettings response,
QString &  errorMessage 
)
virtual

Reimplemented from ChannelAPI.

Definition at line 536 of file freqtracker.cpp.

References SWGSDRangel::SWGChannelSettings::getFreqTrackerSettings(), SWGSDRangel::SWGFreqTrackerSettings::init(), m_settings, SWGSDRangel::SWGChannelSettings::setFreqTrackerSettings(), and webapiFormatChannelSettings().

Referenced by getStreamCenterFrequency().

539 {
540  (void) errorMessage;
542  response.getFreqTrackerSettings()->init();
544  return 200;
545 }
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings &response, const FreqTrackerSettings &settings)
SWGFreqTrackerSettings * getFreqTrackerSettings()
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
void setFreqTrackerSettings(SWGFreqTrackerSettings *freq_tracker_settings)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ webapiSettingsPutPatch()

int FreqTracker::webapiSettingsPutPatch ( bool  force,
const QStringList &  channelSettingsKeys,
SWGSDRangel::SWGChannelSettings response,
QString &  errorMessage 
)
virtual

Reimplemented from ChannelAPI.

Definition at line 547 of file freqtracker.cpp.

References FreqTracker::MsgConfigureFreqTracker::create(), SWGSDRangel::SWGFreqTrackerSettings::getAlphaEma(), SWGSDRangel::SWGChannelSettings::getAmDemodSettings(), SWGSDRangel::SWGChannelSettings::getFreqTrackerSettings(), SWGSDRangel::SWGFreqTrackerSettings::getInputFrequencyOffset(), SWGSDRangel::SWGFreqTrackerSettings::getLog2Decim(), SWGSDRangel::SWGFreqTrackerSettings::getPllPskOrder(), SWGSDRangel::SWGAMDemodSettings::getReverseApiAddress(), SWGSDRangel::SWGAMDemodSettings::getReverseApiChannelIndex(), SWGSDRangel::SWGAMDemodSettings::getReverseApiDeviceIndex(), SWGSDRangel::SWGAMDemodSettings::getReverseApiPort(), SWGSDRangel::SWGFreqTrackerSettings::getRfBandwidth(), SWGSDRangel::SWGFreqTrackerSettings::getRgbColor(), SWGSDRangel::SWGFreqTrackerSettings::getRrc(), SWGSDRangel::SWGFreqTrackerSettings::getRrcRolloff(), SWGSDRangel::SWGFreqTrackerSettings::getSquelch(), SWGSDRangel::SWGFreqTrackerSettings::getSquelchGate(), SWGSDRangel::SWGFreqTrackerSettings::getTitle(), SWGSDRangel::SWGFreqTrackerSettings::getTrackerType(), SWGSDRangel::SWGFreqTrackerSettings::getTracking(), SWGSDRangel::SWGAMDemodSettings::getUseReverseApi(), FreqTrackerSettings::m_alphaEMA, BasebandSampleSink::m_guiMessageQueue, FreqTrackerSettings::m_inputFrequencyOffset, BasebandSampleSink::m_inputMessageQueue, FreqTrackerSettings::m_log2Decim, FreqTrackerSettings::m_pllPskOrder, FreqTrackerSettings::m_reverseAPIAddress, FreqTrackerSettings::m_reverseAPIChannelIndex, FreqTrackerSettings::m_reverseAPIDeviceIndex, FreqTrackerSettings::m_reverseAPIPort, FreqTrackerSettings::m_rfBandwidth, FreqTrackerSettings::m_rgbColor, FreqTrackerSettings::m_rrc, FreqTrackerSettings::m_rrcRolloff, m_settings, FreqTrackerSettings::m_squelch, FreqTrackerSettings::m_squelchGate, FreqTrackerSettings::m_title, FreqTrackerSettings::m_trackerType, FreqTrackerSettings::m_tracking, FreqTrackerSettings::m_useReverseAPI, MessageQueue::push(), FreqTrackerSettings::TrackerFLL, FreqTrackerSettings::TrackerPLL, and webapiFormatChannelSettings().

Referenced by getStreamCenterFrequency().

552 {
553  (void) errorMessage;
554  FreqTrackerSettings settings = m_settings;
555 
556  if (channelSettingsKeys.contains("inputFrequencyOffset")) {
558  }
559  if (channelSettingsKeys.contains("rfBandwidth")) {
560  settings.m_rfBandwidth = response.getFreqTrackerSettings()->getRfBandwidth();
561  }
562  if (channelSettingsKeys.contains("log2Decim")) {
563  settings.m_log2Decim = response.getFreqTrackerSettings()->getLog2Decim();
564  }
565  if (channelSettingsKeys.contains("squelch")) {
566  settings.m_squelch = response.getFreqTrackerSettings()->getSquelch();
567  }
568  if (channelSettingsKeys.contains("rgbColor")) {
569  settings.m_rgbColor = response.getFreqTrackerSettings()->getRgbColor();
570  }
571  if (channelSettingsKeys.contains("title")) {
572  settings.m_title = *response.getFreqTrackerSettings()->getTitle();
573  }
574  if (channelSettingsKeys.contains("alphaEMA")) {
575  float alphaEMA = response.getFreqTrackerSettings()->getAlphaEma();
576  settings.m_alphaEMA = alphaEMA < 0.01 ? 0.01 : alphaEMA > 1.0 ? 1.0 : alphaEMA;
577  }
578  if (channelSettingsKeys.contains("tracking")) {
579  settings.m_tracking = response.getFreqTrackerSettings()->getTracking() ? 1 : 0;
580  }
581  if (channelSettingsKeys.contains("trackerType"))
582  {
583  int32_t trackerTypeCode = response.getFreqTrackerSettings()->getTrackerType();
584  settings.m_trackerType = trackerTypeCode < 0 ?
585  FreqTrackerSettings::TrackerFLL : trackerTypeCode > 1 ?
587  }
588  if (channelSettingsKeys.contains("pllPskOrder")) {
589  settings.m_pllPskOrder = response.getFreqTrackerSettings()->getPllPskOrder();
590  }
591  if (channelSettingsKeys.contains("rrc")) {
592  settings.m_rrc = response.getFreqTrackerSettings()->getRrc() ? 1 : 0;
593  }
594  if (channelSettingsKeys.contains("rrcRolloff")) {
595  settings.m_rrcRolloff = response.getFreqTrackerSettings()->getRrcRolloff();
596  }
597  if (channelSettingsKeys.contains("squelchGate")) {
598  settings.m_squelchGate = response.getFreqTrackerSettings()->getSquelchGate();
599  }
600  if (channelSettingsKeys.contains("useReverseAPI")) {
601  settings.m_useReverseAPI = response.getAmDemodSettings()->getUseReverseApi() != 0;
602  }
603  if (channelSettingsKeys.contains("reverseAPIAddress")) {
605  }
606  if (channelSettingsKeys.contains("reverseAPIPort")) {
607  settings.m_reverseAPIPort = response.getAmDemodSettings()->getReverseApiPort();
608  }
609  if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
611  }
612  if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
614  }
615 
616  MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(settings, force);
618 
619  qDebug("FreqTracker::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
620  if (m_guiMessageQueue) // forward to GUI if any
621  {
622  MsgConfigureFreqTracker *msgToGUI = MsgConfigureFreqTracker::create(settings, force);
623  m_guiMessageQueue->push(msgToGUI);
624  }
625 
626  webapiFormatChannelSettings(response, settings);
627 
628  return 200;
629 }
void push(Message *message, bool emitSignal=true)
Push message onto queue.
int m_squelchGate
in 10s of ms
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings &response, const FreqTrackerSettings &settings)
SWGFreqTrackerSettings * getFreqTrackerSettings()
MessageQueue m_inputMessageQueue
Queue for asynchronous inbound communication.
MessageQueue * m_guiMessageQueue
Input message queue to the GUI.
SWGAMDemodSettings * getAmDemodSettings()
int int32_t
Definition: rtptypes_win.h:45
FreqTrackerSettings m_settings
Definition: freqtracker.h:207
uint32_t m_rrcRolloff
in 100ths
static MsgConfigureFreqTracker * create(const FreqTrackerSettings &settings, bool force)
Definition: freqtracker.h:59
float m_alphaEMA
alpha factor for delta frequency EMA
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ m_avgDeltaFreq

Real FreqTracker::m_avgDeltaFreq
private

Definition at line 244 of file freqtracker.h.

Referenced by applySettings(), getAvgDeltaFreq(), and tick().

◆ m_channelId

const QString FreqTracker::m_channelId = "FreqTracker"
static

Definition at line 186 of file freqtracker.h.

Referenced by FreqTracker(), and FreqTrackerPlugin::initPlugin().

◆ m_channelIdURI

const QString FreqTracker::m_channelIdURI = "sdrangel.channel.freqtracker"
static

Definition at line 185 of file freqtracker.h.

Referenced by FreqTrackerGUI::FreqTrackerGUI(), and FreqTrackerPlugin::initPlugin().

◆ m_channelizer

DownChannelizer* FreqTracker::m_channelizer
private

Definition at line 206 of file freqtracker.h.

Referenced by configureChannelizer(), FreqTracker(), and ~FreqTracker().

◆ m_channelSampleRate

uint32_t FreqTracker::m_channelSampleRate
private

◆ m_deviceAPI

DeviceAPI* FreqTracker::m_deviceAPI
private

Definition at line 204 of file freqtracker.h.

Referenced by FreqTracker(), and ~FreqTracker().

◆ m_deviceSampleRate

uint32_t FreqTracker::m_deviceSampleRate
private

Definition at line 209 of file freqtracker.h.

Referenced by configureChannelizer(), and handleMessage().

◆ m_fll

FreqLockComplex FreqTracker::m_fll
private

Definition at line 217 of file freqtracker.h.

Referenced by applySettings(), configureChannelizer(), getFrequency(), and processOneSample().

◆ m_inputFrequencyOffset

int FreqTracker::m_inputFrequencyOffset
private

Definition at line 211 of file freqtracker.h.

Referenced by applyChannelSettings(), FreqTracker(), and start().

◆ m_inputSampleRate

int FreqTracker::m_inputSampleRate
private

◆ m_interpolator

Interpolator FreqTracker::m_interpolator
private

Definition at line 218 of file freqtracker.h.

Referenced by feed(), and setInterpolator().

◆ m_interpolatorDistance

Real FreqTracker::m_interpolatorDistance
private

Definition at line 219 of file freqtracker.h.

Referenced by feed(), and setInterpolator().

◆ m_interpolatorDistanceRemain

Real FreqTracker::m_interpolatorDistanceRemain
private

Definition at line 220 of file freqtracker.h.

Referenced by feed(), and setInterpolator().

◆ m_lastCorrAbs

int FreqTracker::m_lastCorrAbs
private

Definition at line 243 of file freqtracker.h.

Referenced by applySettings(), and tick().

◆ m_magsq

double FreqTracker::m_magsq
private

Definition at line 228 of file freqtracker.h.

Referenced by FreqTracker(), getMagSq(), getMagSqLevels(), and processOneSample().

◆ m_magsqCount

int FreqTracker::m_magsqCount
private

Definition at line 231 of file freqtracker.h.

Referenced by getMagSqLevels(), and processOneSample().

◆ m_magSqLevelStore

MagSqLevelsStore FreqTracker::m_magSqLevelStore
private

Definition at line 232 of file freqtracker.h.

Referenced by getMagSqLevels().

◆ m_magsqPeak

double FreqTracker::m_magsqPeak
private

Definition at line 230 of file freqtracker.h.

Referenced by getMagSqLevels(), and processOneSample().

◆ m_magsqSum

double FreqTracker::m_magsqSum
private

Definition at line 229 of file freqtracker.h.

Referenced by getMagSqLevels(), and processOneSample().

◆ m_movingAverage

MovingAverageUtil<Real, double, 16> FreqTracker::m_movingAverage
private

Definition at line 234 of file freqtracker.h.

Referenced by processOneSample().

◆ m_nco

NCOF FreqTracker::m_nco
private

Definition at line 215 of file freqtracker.h.

Referenced by applyChannelSettings(), and feed().

◆ m_networkManager

QNetworkAccessManager* FreqTracker::m_networkManager
private

Definition at line 237 of file freqtracker.h.

Referenced by FreqTracker(), webapiReverseSendSettings(), and ~FreqTracker().

◆ m_networkRequest

QNetworkRequest FreqTracker::m_networkRequest
private

Definition at line 238 of file freqtracker.h.

Referenced by webapiReverseSendSettings().

◆ m_pll

PhaseLockComplex FreqTracker::m_pll
private

◆ m_rrcFilter

fftfilt* FreqTracker::m_rrcFilter
private

Definition at line 222 of file freqtracker.h.

Referenced by FreqTracker(), processOneSample(), setInterpolator(), and ~FreqTracker().

◆ m_running

bool FreqTracker::m_running
private

Definition at line 213 of file freqtracker.h.

Referenced by feed(), start(), and stop().

◆ m_settings

FreqTrackerSettings FreqTracker::m_settings
private

◆ m_settingsMutex

QMutex FreqTracker::m_settingsMutex
private

Definition at line 245 of file freqtracker.h.

Referenced by feed(), and setInterpolator().

◆ m_squelchCount

uint32_t FreqTracker::m_squelchCount
private

Definition at line 225 of file freqtracker.h.

Referenced by processOneSample(), and start().

◆ m_squelchGate

uint32_t FreqTracker::m_squelchGate
private

Squelch gate in samples.

Definition at line 227 of file freqtracker.h.

Referenced by processOneSample(), and setInterpolator().

◆ m_squelchLevel

Real FreqTracker::m_squelchLevel
private

Definition at line 224 of file freqtracker.h.

Referenced by applySettings(), and processOneSample().

◆ m_squelchOpen

bool FreqTracker::m_squelchOpen
private

Definition at line 226 of file freqtracker.h.

Referenced by getSquelchOpen(), processOneSample(), and webapiFormatChannelReport().

◆ m_threadedChannelizer

ThreadedBasebandSampleSink* FreqTracker::m_threadedChannelizer
private

Definition at line 205 of file freqtracker.h.

Referenced by FreqTracker(), and ~FreqTracker().

◆ m_tickCount

uint32_t FreqTracker::m_tickCount
private

Definition at line 242 of file freqtracker.h.

Referenced by connectTimer(), and tick().

◆ m_timer

const QTimer* FreqTracker::m_timer
private

Definition at line 240 of file freqtracker.h.

Referenced by connectTimer(), disconnectTimer(), FreqTracker(), and ~FreqTracker().

◆ m_timerConnected

bool FreqTracker::m_timerConnected
private

Definition at line 241 of file freqtracker.h.

Referenced by connectTimer(), and disconnectTimer().

◆ m_udpBlockSize

const int FreqTracker::m_udpBlockSize = 512
staticprivate

Definition at line 236 of file freqtracker.h.


The documentation for this class was generated from the following files: