Change m_TRperiod from qint32 to double. Functional, but needs more testing!

This commit is contained in:
Joe Taylor 2019-05-22 12:44:28 -04:00
parent 10aaec90e3
commit 0d3be0128b
16 changed files with 113 additions and 104 deletions

View File

@ -2,6 +2,7 @@
#include <QDateTime> #include <QDateTime>
#include <QtAlgorithms> #include <QtAlgorithms>
#include <QDebug> #include <QDebug>
#include <math.h>
#include "commons.h" #include "commons.h"
#include "moc_Detector.cpp" #include "moc_Detector.cpp"
@ -10,7 +11,7 @@ extern "C" {
void fil4_(qint16*, qint32*, qint16*, qint32*); void fil4_(qint16*, qint32*, qint16*, qint32*);
} }
Detector::Detector (unsigned frameRate, unsigned periodLengthInSeconds, Detector::Detector (unsigned frameRate, double periodLengthInSeconds,
unsigned downSampleFactor, QObject * parent) unsigned downSampleFactor, QObject * parent)
: AudioDevice (parent) : AudioDevice (parent)
, m_frameRate (frameRate) , m_frameRate (frameRate)
@ -128,5 +129,6 @@ unsigned Detector::secondInPeriod () const
qint64 now (QDateTime::currentMSecsSinceEpoch ()); qint64 now (QDateTime::currentMSecsSinceEpoch ());
unsigned secondInToday ((now % 86400000LL) / 1000); unsigned secondInToday ((now % 86400000LL) / 1000);
return secondInToday % m_period; unsigned secInPeriod = fmod(double(secondInToday),m_period);
return secInPeriod;
} }

View File

@ -22,9 +22,10 @@ public:
// //
// the samplesPerFFT argument is the number after down sampling // the samplesPerFFT argument is the number after down sampling
// //
Detector (unsigned frameRate, unsigned periodLengthInSeconds, unsigned downSampleFactor = 4u, QObject * parent = 0); Detector (unsigned frameRate, double periodLengthInSeconds, unsigned downSampleFactor = 4u,
QObject * parent = 0);
void setTRPeriod(unsigned p) {m_period=p;} void setTRPeriod(double p) {m_period=p;}
bool reset () override; bool reset () override;
Q_SIGNAL void framesWritten (qint64) const; Q_SIGNAL void framesWritten (qint64) const;
@ -43,7 +44,7 @@ private:
unsigned secondInPeriod () const; unsigned secondInPeriod () const;
unsigned m_frameRate; unsigned m_frameRate;
unsigned m_period; double m_period;
unsigned m_downSampleFactor; unsigned m_downSampleFactor;
qint32 m_samplesPerFFT; // after any down sampling qint32 m_samplesPerFFT; // after any down sampling
qint32 m_ns; qint32 m_ns;

View File

@ -25,7 +25,7 @@ double constexpr Modulator::m_twoPi;
// unsigned m_nspd=1.2*48000.0/wpm; // unsigned m_nspd=1.2*48000.0/wpm;
// m_nspd=3072; //18.75 WPM // m_nspd=3072; //18.75 WPM
Modulator::Modulator (unsigned frameRate, unsigned periodLengthInSeconds, Modulator::Modulator (unsigned frameRate, double periodLengthInSeconds,
QObject * parent) QObject * parent)
: AudioDevice {parent} : AudioDevice {parent}
, m_quickClose {false} , m_quickClose {false}
@ -45,14 +45,13 @@ Modulator::Modulator (unsigned frameRate, unsigned periodLengthInSeconds,
void Modulator::start (unsigned symbolsLength, double framesPerSymbol, void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
double frequency, double toneSpacing, double frequency, double toneSpacing,
SoundOutput * stream, Channel channel, SoundOutput * stream, Channel channel,
bool synchronize, bool fastMode, double dBSNR, int TRperiod) bool synchronize, bool fastMode, double dBSNR, double TRperiod)
{ {
Q_ASSERT (stream); Q_ASSERT (stream);
// Time according to this computer which becomes our base time // Time according to this computer which becomes our base time
qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000; qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000;
// qDebug() << "ModStart" << symbolsLength << framesPerSymbol // qDebug() << "ModStart" << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.sss");
// << frequency << toneSpacing;
if(m_state != Idle) stop (); if(m_state != Idle) stop ();
@ -78,7 +77,7 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
if (m_snr > 1.0) m_fac = 3000.0 / m_snr; if (m_snr > 1.0) m_fac = 3000.0 / m_snr;
} }
unsigned mstr = ms0 % (1000 * m_period); // ms in period unsigned mstr = ms0 % int(1000.0*m_period); // ms in period
// round up to an exact portion of a second that allows for startup // round up to an exact portion of a second that allows for startup
// delays // delays
@ -183,12 +182,12 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
if(!m_tuning) isym=m_ic/(4.0*m_nsps); // Actual fsample=48000 if(!m_tuning) isym=m_ic/(4.0*m_nsps); // Actual fsample=48000
bool slowCwId=((isym >= m_symbolsLength) && (icw[0] > 0)) && (!m_bFastMode); bool slowCwId=((isym >= m_symbolsLength) && (icw[0] > 0)) && (!m_bFastMode);
if(m_TRperiod==3) slowCwId=false; if(m_TRperiod==3.0) slowCwId=false;
bool fastCwId=false; bool fastCwId=false;
static bool bCwId=false; static bool bCwId=false;
qint64 ms = QDateTime::currentMSecsSinceEpoch(); qint64 ms = QDateTime::currentMSecsSinceEpoch();
float tsec=0.001*(ms % (1000*m_TRperiod)); float tsec=0.001*(ms % int(1000*m_TRperiod));
if(m_bFastMode and (icw[0]>0) and (tsec>(m_TRperiod-5.0))) fastCwId=true; if(m_bFastMode and (icw[0]>0) and (tsec > (m_TRperiod-5.0))) fastCwId=true;
if(!m_bFastMode) m_nspd=2560; // 22.5 WPM if(!m_bFastMode) m_nspd=2560; // 22.5 WPM
// qDebug() << "Mod A" << m_ic << isym << tsec; // qDebug() << "Mod A" << m_ic << isym << tsec;
@ -259,7 +258,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
i1= m_symbolsLength * 4.0 * m_nsps; i1= m_symbolsLength * 4.0 * m_nsps;
} }
if(m_bFastMode and !m_tuning) { if(m_bFastMode and !m_tuning) {
i1=m_TRperiod*48000 - 24000; i1=m_TRperiod*48000.0 - 24000.0;
i0=i1-816; i0=i1-816;
} }
@ -267,7 +266,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) { for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) {
isym=0; isym=0;
if(!m_tuning and m_TRperiod!=3) isym=m_ic/(4.0*m_nsps); //Actual fsample=48000 if(!m_tuning and m_TRperiod!=3.0) isym=m_ic/(4.0*m_nsps); //Actual fsample=48000
if(m_bFastMode) isym=isym%m_symbolsLength; if(m_bFastMode) isym=isym%m_symbolsLength;
if (isym != m_isym0 || m_frequency != m_frequency0) { if (isym != m_isym0 || m_frequency != m_frequency0) {
if(itone[0]>=100) { if(itone[0]>=100) {

View File

@ -23,7 +23,7 @@ class Modulator
public: public:
enum ModulatorState {Synchronizing, Active, Idle}; enum ModulatorState {Synchronizing, Active, Idle};
Modulator (unsigned frameRate, unsigned periodLengthInSeconds, QObject * parent = nullptr); Modulator (unsigned frameRate, double periodLengthInSeconds, QObject * parent = nullptr);
void close () override; void close () override;
@ -31,14 +31,14 @@ public:
double frequency () const {return m_frequency;} double frequency () const {return m_frequency;}
bool isActive () const {return m_state != Idle;} bool isActive () const {return m_state != Idle;}
void setSpread(double s) {m_fSpread=s;} void setSpread(double s) {m_fSpread=s;}
void setTRPeriod(unsigned p) {m_period=p;} void setTRPeriod(double p) {m_period=p;}
void set_nsym(int n) {m_symbolsLength=n;} void set_nsym(int n) {m_symbolsLength=n;}
void set_ms0(qint64 ms) {m_ms0=ms;} void set_ms0(qint64 ms) {m_ms0=ms;}
Q_SLOT void start (unsigned symbolsLength, double framesPerSymbol, double frequency, Q_SLOT void start (unsigned symbolsLength, double framesPerSymbol, double frequency,
double toneSpacing, SoundOutput *, Channel = Mono, double toneSpacing, SoundOutput *, Channel = Mono,
bool synchronize = true, bool fastMode = false, bool synchronize = true, bool fastMode = false,
double dBSNR = 99., int TRperiod=60); double dBSNR = 99., double TRperiod=60.0);
Q_SLOT void stop (bool quick = false); Q_SLOT void stop (bool quick = false);
Q_SLOT void tune (bool newState = true); Q_SLOT void tune (bool newState = true);
Q_SLOT void setFrequency (double newFrequency) {m_frequency = newFrequency;} Q_SLOT void setFrequency (double newFrequency) {m_frequency = newFrequency;}
@ -72,14 +72,14 @@ private:
double m_fac; double m_fac;
double m_toneSpacing; double m_toneSpacing;
double m_fSpread; double m_fSpread;
double m_TRperiod;
double m_period;
qint64 m_silentFrames; qint64 m_silentFrames;
qint64 m_ms0; qint64 m_ms0;
qint32 m_TRperiod;
qint16 m_ramp; qint16 m_ramp;
unsigned m_frameRate; unsigned m_frameRate;
unsigned m_period;
ModulatorState volatile m_state; ModulatorState volatile m_state;
bool volatile m_tuning; bool volatile m_tuning;

View File

@ -11,6 +11,7 @@
#include <QDir> #include <QDir>
#include <QCloseEvent> #include <QCloseEvent>
#include <QDebug> #include <QDebug>
#include <math.h>
#include "commons.h" #include "commons.h"
#include "MessageBox.hpp" #include "MessageBox.hpp"
@ -90,7 +91,7 @@ void Astro::write_settings ()
} }
auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const& hisgrid, Frequency freq, auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const& hisgrid, Frequency freq,
bool dx_is_self, bool bTx, bool no_tx_QSY, int TR_period) -> Correction bool dx_is_self, bool bTx, bool no_tx_QSY, double TR_period) -> Correction
{ {
Frequency freq_moon {freq}; Frequency freq_moon {freq};
double azsun,elsun,azmoon,elmoon,azmoondx,elmoondx; double azsun,elsun,azmoon,elmoon,azmoondx,elmoondx;
@ -211,8 +212,8 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
// //
// use a base time of (secs-since-epoch + 2) so as to be sure // use a base time of (secs-since-epoch + 2) so as to be sure
// we do the next period if we calculate just before it starts // we do the next period if we calculate just before it starts
auto sec_since_epoch = t.toMSecsSinceEpoch () / 1000 + 2; auto sec_since_epoch = t.toMSecsSinceEpoch ()/1000 + 2;
auto target_sec = sec_since_epoch - sec_since_epoch % TR_period + TR_period / 2; auto target_sec = sec_since_epoch - fmod(double(sec_since_epoch),TR_period) + 0.5*TR_period;
auto target_date_time = QDateTime::fromMSecsSinceEpoch (target_sec * 1000, Qt::UTC); auto target_date_time = QDateTime::fromMSecsSinceEpoch (target_sec * 1000, Qt::UTC);
QString date {target_date_time.date().toString("yyyy MMM dd").trimmed ()}; QString date {target_date_time.date().toString("yyyy MMM dd").trimmed ()};
QString utc {target_date_time.time().toString().trimmed ()}; QString utc {target_date_time.time().toString().trimmed ()};

View File

@ -44,7 +44,7 @@ public:
bool dx_is_self, bool dx_is_self,
bool bTx, bool bTx,
bool no_tx_QSY, bool no_tx_QSY,
int TR_period); double TR_period);
bool doppler_tracking () const; bool doppler_tracking () const;
Q_SLOT void nominal_frequency (Frequency rx, Frequency tx); Q_SLOT void nominal_frequency (Frequency rx, Frequency tx);

View File

@ -86,9 +86,9 @@ void FastGraph::on_greenZeroSlider_valueChanged(int value)
ui->fastPlot->draw(); ui->fastPlot->draw();
} }
void FastGraph::setTRPeriod(int n) void FastGraph::setTRPeriod(double p)
{ {
m_TRperiod=n; m_TRperiod=p;
ui->fastPlot->setTRperiod(m_TRperiod); ui->fastPlot->setTRperiod(m_TRperiod);
} }

View File

@ -22,7 +22,7 @@ public:
void plotSpec(bool diskData, int UTCdisk); void plotSpec(bool diskData, int UTCdisk);
void saveSettings(); void saveSettings();
void setTRPeriod(int n); void setTRPeriod(double p);
void setMode(QString mode); void setMode(QString mode);
signals: signals:
@ -40,8 +40,8 @@ protected:
private: private:
QSettings * m_settings; QSettings * m_settings;
float m_ave; float m_ave;
qint32 m_TRperiod; double m_TRperiod;
QScopedPointer<Ui::FastGraph> ui; QScopedPointer<Ui::FastGraph> ui;
}; };

View File

@ -135,11 +135,11 @@ void FPlotter::setGreenZero(int n)
m_bPaint2=true; m_bPaint2=true;
} }
void FPlotter::setTRperiod(int n) void FPlotter::setTRperiod(double p)
{ {
m_TRperiod=n; m_TRperiod=p;
m_pixPerSecond=12000.0/512.0; m_pixPerSecond=12000.0/512.0;
if(m_TRperiod<30) m_pixPerSecond=12000.0/256.0; if(m_TRperiod<30.0) m_pixPerSecond=12000.0/256.0;
drawScale(); drawScale();
update(); update();
} }

View File

@ -37,7 +37,7 @@ public:
void setPlotZero(int plotZero); void setPlotZero(int plotZero);
void setPlotGain(int plotGain); void setPlotGain(int plotGain);
void setGreenZero(int n); void setGreenZero(int n);
void setTRperiod(int n); void setTRperiod(double p);
void drawScale(); void drawScale();
void setMode(QString mode); void setMode(QString mode);
@ -68,6 +68,7 @@ private:
QString m_mode; QString m_mode;
double m_pixPerSecond; double m_pixPerSecond;
double m_TRperiod;
qint32 m_hdivs; qint32 m_hdivs;
qint32 m_h; qint32 m_h;
@ -75,7 +76,6 @@ private:
qint32 m_h2; qint32 m_h2;
QPixmap m_HorizPixmap; QPixmap m_HorizPixmap;
qint32 m_jh0; qint32 m_jh0;
qint32 m_TRperiod;
bool m_bPaint2; bool m_bPaint2;
}; };

View File

@ -246,7 +246,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_logDlg (new LogQSO (program_title (), m_settings, &m_config, nullptr)), m_logDlg (new LogQSO (program_title (), m_settings, &m_config, nullptr)),
m_lastDialFreq {0}, m_lastDialFreq {0},
m_dialFreqRxWSPR {0}, m_dialFreqRxWSPR {0},
m_detector {new Detector {RX_SAMPLE_RATE, NTMAX, downSampleFactor}}, m_detector {new Detector {RX_SAMPLE_RATE, double(NTMAX), downSampleFactor}},
m_FFTSize {6192 / 2}, // conservative value to avoid buffer overruns m_FFTSize {6192 / 2}, // conservative value to avoid buffer overruns
m_soundInput {new SoundInput}, m_soundInput {new SoundInput},
m_modulator {new Modulator {TX_SAMPLE_RATE, NTMAX}}, m_modulator {new Modulator {TX_SAMPLE_RATE, NTMAX}},
@ -257,6 +257,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_freqTxNominal {0}, m_freqTxNominal {0},
m_s6 {0.}, m_s6 {0.},
m_tRemaining {0.}, m_tRemaining {0.},
m_TRperiod {60.0},
m_DTtol {3.0}, m_DTtol {3.0},
m_waterfallAvg {1}, m_waterfallAvg {1},
m_ntx {1}, m_ntx {1},
@ -268,7 +269,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_nutc0 {999999}, m_nutc0 {999999},
m_ntr {0}, m_ntr {0},
m_tx {0}, m_tx {0},
m_TRperiod {60},
m_inGain {0}, m_inGain {0},
m_secID {0}, m_secID {0},
m_idleMinutes {0}, m_idleMinutes {0},
@ -877,7 +877,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect (&m_wav_future_watcher, &QFutureWatcher<void>::finished, this, &MainWindow::diskDat); connect (&m_wav_future_watcher, &QFutureWatcher<void>::finished, this, &MainWindow::diskDat);
connect(&watcher3, SIGNAL(finished()),this,SLOT(fast_decode_done())); connect(&watcher3, SIGNAL(finished()),this,SLOT(fast_decode_done()));
// Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, &m_detector, m_downSampleFactor, m_config.audio_input_channel ());
Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, m_detector, m_downSampleFactor, m_config.audio_input_channel ()); Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, m_detector, m_downSampleFactor, m_config.audio_input_channel ());
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, m_msAudioOutputBuffered); Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, m_msAudioOutputBuffered);
Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT); Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT);
@ -1355,7 +1354,7 @@ void MainWindow::dataSink(qint64 frames)
} }
// Get power, spectrum, and ihsym // Get power, spectrum, and ihsym
int trmin=m_TRperiod/60; int trmin=m_TRperiod/60.0;
// int k (frames - 1); // int k (frames - 1);
dec_data.params.nfa=m_wideGraph->nStartFreq(); dec_data.params.nfa=m_wideGraph->nStartFreq();
dec_data.params.nfb=m_wideGraph->Fmax(); dec_data.params.nfb=m_wideGraph->Fmax();
@ -1452,14 +1451,15 @@ void MainWindow::dataSink(qint64 frames)
if(!m_mode.startsWith ("WSPR")) decode(); //Start decoder if(!m_mode.startsWith ("WSPR")) decode(); //Start decoder
if(!m_diskData) { //Always save; may delete later if(!m_diskData) { //Always save; may delete later
if(m_mode=="FT8" or m_mode=="FT4") { if(m_mode=="FT8" or m_mode=="FT4") {
int n=now.time().second() % m_TRperiod; int n=fmod(double(now.time().second()),m_TRperiod);
if(n<(m_TRperiod/2)) n=n+m_TRperiod; if(n<(m_TRperiod/2)) n=n+m_TRperiod;
auto const& period_start=now.addSecs(-n); auto const& period_start=now.addSecs(-n);
m_fnameWE=m_config.save_directory().absoluteFilePath (period_start.toString("yyMMdd_hhmmss")); m_fnameWE=m_config.save_directory().absoluteFilePath (period_start.toString("yyMMdd_hhmmss"));
// qDebug() << "datasink 2" << QDateTime::currentDateTimeUtc().toString("ss.zzz")
// << n << period_start.toString("ss.zzz");
} else { } else {
auto const& period_start = now.addSecs (-(now.time ().minute () % (m_TRperiod / 60)) * 60); auto const& period_start = now.addSecs (-(now.time ().minute () % (int(m_TRperiod) / 60)) * 60);
m_fnameWE=m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmm")); m_fnameWE=m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmm"));
} }
m_fileToSave.clear (); m_fileToSave.clear ();
@ -1589,7 +1589,7 @@ void MainWindow::fastSink(qint64 frames)
int ihr=tnow.toString("hh").toInt(); int ihr=tnow.toString("hh").toInt();
int imin=tnow.toString("mm").toInt(); int imin=tnow.toString("mm").toInt();
int isec=tnow.toString("ss").toInt(); int isec=tnow.toString("ss").toInt();
isec=isec - isec%m_TRperiod; isec=isec - fmod(double(isec),m_TRperiod);
int nutc0=10000*ihr + 100*imin + isec; int nutc0=10000*ihr + 100*imin + isec;
if(m_diskData) nutc0=m_UTCdisk; if(m_diskData) nutc0=m_UTCdisk;
char line[80]; char line[80];
@ -1669,7 +1669,7 @@ void MainWindow::fastSink(qint64 frames)
if(decodeNow or m_bFastDone) { if(decodeNow or m_bFastDone) {
if(!m_diskData) { if(!m_diskData) {
QDateTime now {QDateTime::currentDateTimeUtc()}; QDateTime now {QDateTime::currentDateTimeUtc()};
int n=now.time().second() % m_TRperiod; int n=fmod(double(now.time().second()),m_TRperiod);
if(n<(m_TRperiod/2)) n=n+m_TRperiod; if(n<(m_TRperiod/2)) n=n+m_TRperiod;
auto const& period_start = now.addSecs (-n); auto const& period_start = now.addSecs (-n);
m_fnameWE = m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmmss")); m_fnameWE = m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmmss"));
@ -1679,11 +1679,11 @@ void MainWindow::fastSink(qint64 frames)
// the following is potential a threading hazard - not a good // the following is potential a threading hazard - not a good
// idea to pass pointer to be processed in another thread // idea to pass pointer to be processed in another thread
m_saveWAVWatcher.setFuture (QtConcurrent::run (std::bind (&MainWindow::save_wave_file, m_saveWAVWatcher.setFuture (QtConcurrent::run (std::bind (&MainWindow::save_wave_file,
this, m_fnameWE, &dec_data.d2[0], m_TRperiod*12000, m_config.my_callsign(), this, m_fnameWE, &dec_data.d2[0], int(m_TRperiod*12000.0), m_config.my_callsign(),
m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid))); m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid)));
} }
if(m_mode!="MSK144") { if(m_mode!="MSK144") {
killFileTimer.start (3*1000*m_TRperiod/4); //Kill 3/4 period from now killFileTimer.start (int(750.0*m_TRperiod)); //Kill 3/4 period from now
} }
} }
m_bFastDone=false; m_bFastDone=false;
@ -2218,7 +2218,6 @@ void MainWindow::createStatusBar() //createStatusBar
statusBar()->addPermanentWidget(&progressBar); statusBar()->addPermanentWidget(&progressBar);
progressBar.setMinimumSize (QSize {150, 18}); progressBar.setMinimumSize (QSize {150, 18});
progressBar.setFormat ("%v/%m");
statusBar ()->addPermanentWidget (&watchdog_label); statusBar ()->addPermanentWidget (&watchdog_label);
update_watchdog_label (); update_watchdog_label ();
@ -2631,7 +2630,8 @@ void MainWindow::read_wav_file (QString const& fname)
bool ok=file.open (BWFFile::ReadOnly); bool ok=file.open (BWFFile::ReadOnly);
if(ok) { if(ok) {
auto bytes_per_frame = file.format ().bytesPerFrame (); auto bytes_per_frame = file.format ().bytesPerFrame ();
qint64 max_bytes = std::min (std::size_t (m_TRperiod * RX_SAMPLE_RATE), int nsamples=m_TRperiod * RX_SAMPLE_RATE;
qint64 max_bytes = std::min (std::size_t (nsamples),
sizeof (dec_data.d2) / sizeof (dec_data.d2[0]))* bytes_per_frame; sizeof (dec_data.d2) / sizeof (dec_data.d2[0]))* bytes_per_frame;
auto n = file.read (reinterpret_cast<char *> (dec_data.d2), auto n = file.read (reinterpret_cast<char *> (dec_data.d2),
std::min (max_bytes, file.size ())); std::min (max_bytes, file.size ()));
@ -2822,7 +2822,7 @@ void MainWindow::decode() //decode()
} }
m_msec0=QDateTime::currentMSecsSinceEpoch(); m_msec0=QDateTime::currentMSecsSinceEpoch();
if(!m_dataAvailable or m_TRperiod==0) return; if(!m_dataAvailable or m_TRperiod==0.0) return;
ui->DecodeButton->setChecked (true); ui->DecodeButton->setChecked (true);
if(!dec_data.params.nagain && m_diskData && !m_bFastMode && m_mode!="FT8" && m_mode!="FT4") { if(!dec_data.params.nagain && m_diskData && !m_bFastMode && m_mode!="FT8" && m_mode!="FT4") {
dec_data.params.nutc=dec_data.params.nutc/100; dec_data.params.nutc=dec_data.params.nutc/100;
@ -2832,14 +2832,16 @@ void MainWindow::decode() //decode()
int imin=ms/60000; int imin=ms/60000;
int ihr=imin/60; int ihr=imin/60;
imin=imin % 60; imin=imin % 60;
if(m_TRperiod>=60) imin=imin - (imin % (m_TRperiod/60)); if(m_TRperiod>=60) imin=imin - (imin % (int(m_TRperiod)/60));
dec_data.params.nutc=100*ihr + imin; dec_data.params.nutc=100*ihr + imin;
if(m_mode=="ISCAT" or m_mode=="MSK144" or m_bFast9 or m_mode=="FT8" or m_mode=="FT4") { if(m_mode=="ISCAT" or m_mode=="MSK144" or m_bFast9 or m_mode=="FT8" or m_mode=="FT4") {
QDateTime t=QDateTime::currentDateTimeUtc().addSecs(2-m_TRperiod); qint64 ms=1000.0*(2.0-m_TRperiod);
if(m_mode=="FT4") ms=1000.0*(3.0-m_TRperiod);
QDateTime t=QDateTime::currentDateTimeUtc().addMSecs(ms);
ihr=t.toString("hh").toInt(); ihr=t.toString("hh").toInt();
imin=t.toString("mm").toInt(); imin=t.toString("mm").toInt();
int isec=t.toString("ss").toInt(); int isec=t.toString("ss").toInt();
isec=isec - isec%m_TRperiod; if(m_mode!="FT4") isec=isec - fmod(double(isec),m_TRperiod);
dec_data.params.nutc=10000*ihr + 100*imin + isec; dec_data.params.nutc=10000*ihr + 100*imin + isec;
} }
} }
@ -2849,7 +2851,7 @@ void MainWindow::decode() //decode()
int ihr=t.toString("hh").toInt(); int ihr=t.toString("hh").toInt();
int imin=t.toString("mm").toInt(); int imin=t.toString("mm").toInt();
int isec=t.toString("ss").toInt(); int isec=t.toString("ss").toInt();
isec=isec - isec%m_TRperiod; isec=isec - fmod(double(isec),m_TRperiod);
dec_data.params.nutc=10000*ihr + 100*imin + isec; dec_data.params.nutc=10000*ihr + 100*imin + isec;
} }
if(m_nPick==2) dec_data.params.nutc=m_nutc0; if(m_nPick==2) dec_data.params.nutc=m_nutc0;
@ -2948,8 +2950,8 @@ void MainWindow::decode() //decode()
} }
static short int d2b[360000]; static short int d2b[360000];
narg[0]=dec_data.params.nutc; narg[0]=dec_data.params.nutc;
if(m_kdone>12000*m_TRperiod) { if(m_kdone>int(12000.0*m_TRperiod)) {
m_kdone=12000*m_TRperiod; m_kdone=int(12000.0*m_TRperiod);
} }
narg[1]=m_kdone; narg[1]=m_kdone;
narg[2]=m_nSubMode; narg[2]=m_nSubMode;
@ -2968,9 +2970,10 @@ void MainWindow::decode() //decode()
narg[12]=0; narg[12]=0;
narg[13]=-1; narg[13]=-1;
narg[14]=m_config.aggressive(); narg[14]=m_config.aggressive();
int nTRperiod=m_TRperiod;
memcpy(d2b,dec_data.d2,2*360000); memcpy(d2b,dec_data.d2,2*360000);
watcher3.setFuture (QtConcurrent::run (std::bind (fast_decode_,&d2b[0], watcher3.setFuture (QtConcurrent::run (std::bind (fast_decode_,&d2b[0],
&narg[0],&m_TRperiod,&m_msg[0][0], &narg[0],&nTRperiod,&m_msg[0][0],
dec_data.params.mycall,dec_data.params.hiscall,8000,12,12))); dec_data.params.mycall,dec_data.params.hiscall,8000,12,12)));
} else { } else {
memcpy(to, from, qMin(mem_jt9->size(), size)); memcpy(to, from, qMin(mem_jt9->size(), size));
@ -3055,7 +3058,7 @@ void MainWindow::readFromStdout() //readFromStdout
if(line_read.indexOf("<DecodeFinished>") >= 0) { if(line_read.indexOf("<DecodeFinished>") >= 0) {
if(m_mode=="QRA64") m_wideGraph->drawRed(0,0); if(m_mode=="QRA64") m_wideGraph->drawRed(0,0);
m_bDecoded = line_read.mid(20).trimmed().toInt() > 0; m_bDecoded = line_read.mid(20).trimmed().toInt() > 0;
int mswait=3*1000*m_TRperiod/4; int mswait=750.0*m_TRperiod;
if(!m_diskData) killFileTimer.start(mswait); //Kill in 3/4 period if(!m_diskData) killFileTimer.start(mswait); //Kill in 3/4 period
decodeDone (); decodeDone ();
m_startAnother=m_loopall; m_startAnother=m_loopall;
@ -3081,7 +3084,7 @@ void MainWindow::readFromStdout() //readFromStdout
write_all("Rx",line_read.trimmed()); write_all("Rx",line_read.trimmed());
if (m_config.insert_blank () && m_blankLine && SpecOp::FOX != m_config.special_op_id()) { if (m_config.insert_blank () && m_blankLine && SpecOp::FOX != m_config.special_op_id()) {
QString band; QString band;
if((QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged) > 4*m_TRperiod/4) { if((QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged) > 4*int(m_TRperiod)/4) {
band = ' ' + m_config.bands ()->find (m_freqNominal); band = ' ' + m_config.bands ()->find (m_freqNominal);
} }
ui->decodedTextBrowser->insertLineSpacer (band.rightJustified (40, '-')); ui->decodedTextBrowser->insertLineSpacer (band.rightJustified (40, '-'));
@ -3241,7 +3244,7 @@ void MainWindow::readFromStdout() //readFromStdout
} }
// extract details and send to PSKreporter // extract details and send to PSKreporter
int nsec=QDateTime::currentMSecsSinceEpoch()/1000-m_secBandChanged; int nsec=QDateTime::currentMSecsSinceEpoch()/1000-m_secBandChanged;
bool okToPost=(nsec>(4*m_TRperiod)/5); bool okToPost=(nsec > int(4*m_TRperiod)/5);
if (stdMsg && okToPost) pskPost(decodedtext); if (stdMsg && okToPost) pskPost(decodedtext);
if((m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64") and m_msgAvgWidget!=NULL) { if((m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64") and m_msgAvgWidget!=NULL) {
@ -3421,7 +3424,7 @@ void MainWindow::guiUpdate()
double txDuration; double txDuration;
QString rt; QString rt;
if(m_TRperiod==0) m_TRperiod=60; if(m_TRperiod==0) m_TRperiod=60.0;
txDuration=0.0; txDuration=0.0;
if(m_modeTx=="FT4") txDuration=0.35 + 105*512/12000.0; // FT4 if(m_modeTx=="FT4") txDuration=0.35 + 105*512/12000.0; // FT4
if(m_modeTx=="FT8") txDuration=1.0 + 79*1920/12000.0; // FT8 if(m_modeTx=="FT8") txDuration=1.0 + 79*1920/12000.0; // FT8
@ -3451,8 +3454,8 @@ void MainWindow::guiUpdate()
double tsec=0.001*ms; double tsec=0.001*ms;
double t2p=fmod(tsec,2*m_TRperiod); double t2p=fmod(tsec,2*m_TRperiod);
m_s6=fmod(tsec,6.0); m_s6=fmod(tsec,6.0);
m_nseq = nsec % m_TRperiod; m_nseq = fmod(double(nsec),m_TRperiod);
m_tRemaining=m_TRperiod - fmod(tsec,double(m_TRperiod)); m_tRemaining=m_TRperiod - fmod(tsec,m_TRperiod);
if(m_mode=="Echo") { if(m_mode=="Echo") {
txDuration=2.4; txDuration=2.4;
@ -3495,8 +3498,7 @@ void MainWindow::guiUpdate()
// Check for "txboth" (testing purposes only) // Check for "txboth" (testing purposes only)
QFile f(m_appDir + "/txboth"); QFile f(m_appDir + "/txboth");
if(f.exists() and if(f.exists() and fmod(tsec,m_TRperiod) < (1.0 + 85.0*m_nsps/12000.0)) m_bTxTime=true;
fmod(tsec,m_TRperiod)<(1.0 + 85.0*m_nsps/12000.0)) m_bTxTime=true;
// Don't transmit another mode in the 30 m WSPR sub-band // Don't transmit another mode in the 30 m WSPR sub-band
Frequency onAirFreq = m_freqNominal + ui->TxFreqSpinBox->value(); Frequency onAirFreq = m_freqNominal + ui->TxFreqSpinBox->value();
@ -3539,7 +3541,7 @@ void MainWindow::guiUpdate()
tx_watchdog (true); // disable transmit tx_watchdog (true); // disable transmit
} }
float fTR=float((ms%(1000*m_TRperiod)))/(1000*m_TRperiod); float fTR=float((ms%int(1000.0*m_TRperiod)))/int(1000.0*m_TRperiod);
QString txMsg; QString txMsg;
if(m_ntx == 1) txMsg=ui->tx1->text(); if(m_ntx == 1) txMsg=ui->tx1->text();
@ -3959,17 +3961,21 @@ void MainWindow::guiUpdate()
if(tHound >= 120 and m_ntx==1) auto_tx_mode(false); if(tHound >= 120 and m_ntx==1) auto_tx_mode(false);
} }
// progressBar.setVisible(!(m_mode=="FT4"));
progressBar.setVisible(true); progressBar.setVisible(true);
progressBar.setFormat ("%v/%m");
if(m_auto and m_mode=="Echo" and m_bEchoTxOK) { if(m_auto and m_mode=="Echo" and m_bEchoTxOK) {
progressBar.setMaximum(6); progressBar.setMaximum(3);
progressBar.setValue(int(m_s6)); progressBar.setValue(int(m_s6));
} }
// if(m_mode!="Echo" and m_mode!="FT4") {
if(m_mode!="Echo") { if(m_mode!="Echo") {
if(m_monitoring or m_transmitting) { if(m_monitoring or m_transmitting) {
progressBar.setMaximum(m_TRperiod); progressBar.setMaximum(m_TRperiod);
int isec=int(fmod(tsec,m_TRperiod)); int isec=int(fmod(tsec,m_TRperiod));
if(m_TRperiod-int(m_TRperiod)>0.0) {
QString progBarLabel;
progBarLabel.sprintf("%d/%3.1f",isec,m_TRperiod);
progressBar.setFormat (progBarLabel);
}
progressBar.setValue(isec); progressBar.setValue(isec);
} else { } else {
progressBar.setValue(0); progressBar.setValue(0);
@ -4152,7 +4158,8 @@ void MainWindow::set_dateTimeQSO(int m_ntx)
} }
else { // we also take of m_TRperiod/2 to allow for late clicks else { // we also take of m_TRperiod/2 to allow for late clicks
auto now = QDateTime::currentDateTimeUtc(); auto now = QDateTime::currentDateTimeUtc();
m_dateTimeQSOOn = now.addSecs (-(m_ntx - 2) * m_TRperiod - (now.time ().second () % m_TRperiod)); m_dateTimeQSOOn = now.addSecs (-(m_ntx - 2) * int(m_TRperiod) -
int(fmod(double(now.time().second()),m_TRperiod)));
} }
} }
@ -4405,7 +4412,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
} }
} }
int nmod = message.timeInSeconds () % (2*m_TRperiod); int nmod = fmod(double(message.timeInSeconds()),2.0*m_TRperiod);
m_txFirst=(nmod!=0); m_txFirst=(nmod!=0);
if( SpecOp::HOUND == m_config.special_op_id() ) m_txFirst=false; //Hound must not transmit first if( SpecOp::HOUND == m_config.special_op_id() ) m_txFirst=false; //Hound must not transmit first
if( SpecOp::FOX == m_config.special_op_id() ) m_txFirst=true; //Fox must always transmit first if( SpecOp::FOX == m_config.special_op_id() ) m_txFirst=true; //Fox must always transmit first
@ -5632,7 +5639,7 @@ void MainWindow::on_actionFT4_triggered()
{ {
m_mode="FT4"; m_mode="FT4";
m_modeTx="FT4"; m_modeTx="FT4";
m_TRperiod=6; m_TRperiod=7.5;
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
m_bFast9=false; m_bFast9=false;
m_bFastMode=false; m_bFastMode=false;
@ -5693,7 +5700,7 @@ void MainWindow::on_actionFT8_triggered()
m_wideGraph->setModeTx(m_modeTx); m_wideGraph->setModeTx(m_modeTx);
VHF_features_enabled(bVHF); VHF_features_enabled(bVHF);
ui->cbAutoSeq->setChecked(true); ui->cbAutoSeq->setChecked(true);
m_TRperiod=15; m_TRperiod=15.0;
m_fastGraph->hide(); m_fastGraph->hide();
m_wideGraph->show(); m_wideGraph->show();
ui->decodedTextLabel2->setText(" UTC dB DT Freq Message"); ui->decodedTextLabel2->setText(" UTC dB DT Freq Message");
@ -5782,7 +5789,7 @@ void MainWindow::on_actionJT4_triggered()
WSPR_config(false); WSPR_config(false);
switch_mode (Modes::JT4); switch_mode (Modes::JT4);
m_modeTx="JT4"; m_modeTx="JT4";
m_TRperiod=60; m_TRperiod=60.0;
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_nsps=6912; //For symspec only m_nsps=6912; //For symspec only
@ -5855,7 +5862,7 @@ void MainWindow::on_actionJT9_triggered()
ui->decodedTextLabel2->setText("UTC dB T Freq Message"); ui->decodedTextLabel2->setText("UTC dB T Freq Message");
} else { } else {
ui->cbAutoSeq->setChecked(false); ui->cbAutoSeq->setChecked(false);
m_TRperiod=60; m_TRperiod=60.0;
ui->decodedTextLabel->setText("UTC dB DT Freq Message"); ui->decodedTextLabel->setText("UTC dB DT Freq Message");
ui->decodedTextLabel2->setText("UTC dB DT Freq Message"); ui->decodedTextLabel2->setText("UTC dB DT Freq Message");
} }
@ -5884,7 +5891,7 @@ void MainWindow::on_actionJT9_JT65_triggered()
m_modeTx="JT9"; m_modeTx="JT9";
} }
m_nSubMode=0; //Dual-mode always means JT9 and JT65A m_nSubMode=0; //Dual-mode always means JT9 and JT65A
m_TRperiod=60; m_TRperiod=60.0;
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_nsps=6912; m_nsps=6912;
@ -5926,7 +5933,7 @@ void MainWindow::on_actionJT65_triggered()
WSPR_config(false); WSPR_config(false);
switch_mode (Modes::JT65); switch_mode (Modes::JT65);
if(m_modeTx!="JT65") on_pbTxMode_clicked(); if(m_modeTx!="JT65") on_pbTxMode_clicked();
m_TRperiod=60; m_TRperiod=60.0;
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_nsps=6912; //For symspec only m_nsps=6912; //For symspec only
@ -6102,7 +6109,7 @@ void MainWindow::on_actionWSPR_triggered()
WSPR_config(true); WSPR_config(true);
switch_mode (Modes::WSPR); switch_mode (Modes::WSPR);
m_modeTx="WSPR"; m_modeTx="WSPR";
m_TRperiod=120; m_TRperiod=120.0;
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_nsps=6912; //For symspec only m_nsps=6912; //For symspec only
@ -6130,7 +6137,7 @@ void MainWindow::on_actionWSPR_LF_triggered()
m_mode="WSPR-LF"; m_mode="WSPR-LF";
switch_mode (Modes::WSPR); switch_mode (Modes::WSPR);
m_modeTx="WSPR-LF"; m_modeTx="WSPR-LF";
m_TRperiod=240; m_TRperiod=240.0;
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_hsymStop=813; m_hsymStop=813;
@ -6146,7 +6153,7 @@ void MainWindow::on_actionEcho_triggered()
on_actionJT4_triggered(); on_actionJT4_triggered();
m_mode="Echo"; m_mode="Echo";
ui->actionEcho->setChecked(true); ui->actionEcho->setChecked(true);
m_TRperiod=3; m_TRperiod=3.0;
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_nsps=6912; //For symspec only m_nsps=6912; //For symspec only
@ -6425,7 +6432,6 @@ void MainWindow::on_bandComboBox_activated (int index)
void MainWindow::band_changed (Frequency f) void MainWindow::band_changed (Frequency f)
{ {
// bool monitor_off=!m_monitoring;
// Set the attenuation value if options are checked // Set the attenuation value if options are checked
QString curBand = ui->bandComboBox->currentText(); QString curBand = ui->bandComboBox->currentText();
if (m_config.pwrBandTxMemory() && !m_tune) { if (m_config.pwrBandTxMemory() && !m_tune) {
@ -6461,7 +6467,6 @@ void MainWindow::band_changed (Frequency f)
if(r<0.9 or r>1.1) m_bVHFwarned=false; if(r<0.9 or r>1.1) m_bVHFwarned=false;
setRig (f); setRig (f);
setXIT (ui->TxFreqSpinBox->value ()); setXIT (ui->TxFreqSpinBox->value ());
// if(monitor_off) monitor(false);
} }
} }
@ -7245,7 +7250,7 @@ void MainWindow::on_sbSubmode_valueChanged(int n)
on_cbFast9_clicked(false); on_cbFast9_clicked(false);
ui->cbFast9->setEnabled(false); ui->cbFast9->setEnabled(false);
ui->sbTR->setVisible(false); ui->sbTR->setVisible(false);
m_TRperiod=60; m_TRperiod=60.0;
} else { } else {
ui->cbFast9->setEnabled(true); ui->cbFast9->setEnabled(true);
} }
@ -7267,9 +7272,9 @@ void MainWindow::on_cbFast9_clicked(bool b)
if(b) { if(b) {
m_TRperiod = ui->sbTR->value (); m_TRperiod = ui->sbTR->value ();
} else { } else {
m_TRperiod=60; m_TRperiod=60.0;
} }
progressBar.setMaximum(m_TRperiod); progressBar.setMaximum(int(m_TRperiod));
m_wideGraph->setPeriod(m_TRperiod,m_nsps); m_wideGraph->setPeriod(m_TRperiod,m_nsps);
fast_config(b); fast_config(b);
statusChanged (); statusChanged ();
@ -7813,7 +7818,7 @@ void MainWindow::setRig (Frequency f)
void MainWindow::fastPick(int x0, int x1, int y) void MainWindow::fastPick(int x0, int x1, int y)
{ {
float pixPerSecond=12000.0/512.0; float pixPerSecond=12000.0/512.0;
if(m_TRperiod<30) pixPerSecond=12000.0/256.0; if(m_TRperiod<30.0) pixPerSecond=12000.0/256.0;
if(m_mode!="ISCAT" and m_mode!="MSK144") return; if(m_mode!="ISCAT" and m_mode!="MSK144") return;
if(!m_decoderBusy) { if(!m_decoderBusy) {
dec_data.params.newdat=0; dec_data.params.newdat=0;
@ -8014,7 +8019,7 @@ void MainWindow::write_transmit_entry (QString const& file_name)
{ {
QTextStream out(&f); QTextStream out(&f);
auto time = QDateTime::currentDateTimeUtc (); auto time = QDateTime::currentDateTimeUtc ();
time = time.addSecs (-(time.time ().second () % m_TRperiod)); time = time.addSecs (-fmod(double(time.time().second()),m_TRperiod));
out << time.toString("yyMMdd_hhmmss") out << time.toString("yyMMdd_hhmmss")
<< " Transmitting " << qSetRealNumberPrecision (12) << (m_freqNominal / 1.e6) << " Transmitting " << qSetRealNumberPrecision (12) << (m_freqNominal / 1.e6)
<< " MHz " << m_modeTx << " MHz " << m_modeTx
@ -8677,7 +8682,7 @@ void MainWindow::write_all(QString txRx, QString message)
t.sprintf("%5d",ui->TxFreqSpinBox->value()); t.sprintf("%5d",ui->TxFreqSpinBox->value());
if (txRx=="Tx") msg=" 0 0.0" + t + " " + message; if (txRx=="Tx") msg=" 0 0.0" + t + " " + message;
auto time = QDateTime::currentDateTimeUtc (); auto time = QDateTime::currentDateTimeUtc ();
time = time.addSecs(-(time.time().second() % m_TRperiod)); time = time.addSecs(-fmod(double(time.time().second()),m_TRperiod));
t.sprintf("%10.3f ",m_freqNominal/1.e6); t.sprintf("%10.3f ",m_freqNominal/1.e6);
if (m_diskData) { if (m_diskData) {
if (m_fileDateTime.size()==11) { if (m_fileDateTime.size()==11) {

View File

@ -406,6 +406,7 @@ private:
double m_s6; double m_s6;
double m_tRemaining; double m_tRemaining;
double m_TRperiod;
float m_DTtol; float m_DTtol;
float m_t0; float m_t0;
@ -428,7 +429,6 @@ private:
qint32 m_ntr; qint32 m_ntr;
qint32 m_tx; qint32 m_tx;
qint32 m_hsym; qint32 m_hsym;
qint32 m_TRperiod;
qint32 m_nsps; qint32 m_nsps;
qint32 m_hsymStop; qint32 m_hsymStop;
qint32 m_inGain; qint32 m_inGain;

View File

@ -241,9 +241,9 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
painter1.setPen(Qt::white); painter1.setPen(Qt::white);
QString t; QString t;
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
int n=(ms/1000) % m_TRperiod; int n = fmod(0.001*ms,m_TRperiod);
QDateTime t1=QDateTime::currentDateTimeUtc().addSecs(-n); QDateTime t1=QDateTime::currentDateTimeUtc().addSecs(-n);
if(m_TRperiod < 60 or m_mode=="FT4") { if(m_TRperiod<60.0) {
t=t1.toString("hh:mm:ss") + " " + m_rxBand; t=t1.toString("hh:mm:ss") + " " + m_rxBand;
} else { } else {
t=t1.toString("hh:mm") + " " + m_rxBand; t=t1.toString("hh:mm") + " " + m_rxBand;
@ -721,9 +721,9 @@ void CPlotter::mouseDoubleClickEvent (QMouseEvent * event)
} }
} }
void CPlotter::setNsps(int ntrperiod, int nsps) //setNsps void CPlotter::setNsps(double trperiod, int nsps) //setNsps
{ {
m_TRperiod=ntrperiod; m_TRperiod=trperiod;
m_nsps=nsps; m_nsps=nsps;
m_fftBinWidth=1500.0/2048.0; m_fftBinWidth=1500.0/2048.0;
if(m_nsps==15360) m_fftBinWidth=1500.0/2048.0; if(m_nsps==15360) m_fftBinWidth=1500.0/2048.0;

View File

@ -56,7 +56,7 @@ public:
void DrawOverlay(); void DrawOverlay();
int rxFreq(); int rxFreq();
void setFsample(int n); void setFsample(int n);
void setNsps(int ntrperiod, int nsps); void setNsps(double trperiod, int nsps);
void setTxFreq(int n); void setTxFreq(int n);
void setMode(QString mode); void setMode(QString mode);
void setSubMode(int n); void setSubMode(int n);
@ -145,6 +145,7 @@ private:
double m_fftBinWidth; double m_fftBinWidth;
double m_dialFreq; double m_dialFreq;
double m_xOffset; double m_xOffset;
double m_TRperiod;
float m_sum[2048]; float m_sum[2048];
@ -161,7 +162,6 @@ private:
qint32 m_h; qint32 m_h;
qint32 m_h1; qint32 m_h1;
qint32 m_h2; qint32 m_h2;
qint32 m_TRperiod;
qint32 m_rxFreq; qint32 m_rxFreq;
qint32 m_txFreq; qint32 m_txFreq;
qint32 m_fMin; qint32 m_fMin;

View File

@ -5,6 +5,7 @@
#include <QSettings> #include <QSettings>
#include <QDateTime> #include <QDateTime>
#include <QKeyEvent> #include <QKeyEvent>
#include <math.h>
#include "ui_widegraph.h" #include "ui_widegraph.h"
#include "commons.h" #include "commons.h"
#include "Configuration.hpp" #include "Configuration.hpp"
@ -23,7 +24,7 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
ui(new Ui::WideGraph), ui(new Ui::WideGraph),
m_settings (settings), m_settings (settings),
m_palettes_path {":/Palettes"}, m_palettes_path {":/Palettes"},
m_ntr0 {0}, m_tr0 {0.0},
m_n {0}, m_n {0},
m_bHaveTransmitted {false} m_bHaveTransmitted {false}
{ {
@ -186,9 +187,8 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat
// Time according to this computer // Time according to this computer
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
int ntr = (ms/1000) % m_TRperiod; double tr = fmod(0.001*ms,m_TRperiod);
if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && (tr<m_tr0))) {
(ntr<m_ntr0 || (m_mode=="FT4" and m_bHaveTransmitted)))) {
float flagValue=1.0e30; float flagValue=1.0e30;
if(m_bHaveTransmitted) flagValue=2.0e30; if(m_bHaveTransmitted) flagValue=2.0e30;
for(int i=0; i<MAX_SCREENSIZE; i++) { for(int i=0; i<MAX_SCREENSIZE; i++) {
@ -199,7 +199,7 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat
} }
m_bHaveTransmitted=false; m_bHaveTransmitted=false;
} }
m_ntr0=ntr; m_tr0=tr;
ui->widePlot->draw(swide,true,false); ui->widePlot->draw(swide,true,false);
} }
} }
@ -278,11 +278,11 @@ int WideGraph::fSpan()
return ui->widePlot->fSpan (); return ui->widePlot->fSpan ();
} }
void WideGraph::setPeriod(int ntrperiod, int nsps) //SetPeriod void WideGraph::setPeriod(double trperiod, int nsps) //SetPeriod
{ {
m_TRperiod=ntrperiod; m_TRperiod=trperiod;
m_nsps=nsps; m_nsps=nsps;
ui->widePlot->setNsps(ntrperiod, nsps); ui->widePlot->setNsps(trperiod, nsps);
} }
void WideGraph::setTxFreq(int n) //setTxFreq void WideGraph::setTxFreq(int n) //setTxFreq

View File

@ -35,7 +35,7 @@ public:
int fSpan(); int fSpan();
void saveSettings(); void saveSettings();
void setFsample(int n); void setFsample(int n);
void setPeriod(int ntrperiod, int nsps); void setPeriod(double trperiod, int nsps);
void setTxFreq(int n); void setTxFreq(int n);
void setMode(QString mode); void setMode(QString mode);
void setSubMode(int n); void setSubMode(int n);
@ -95,10 +95,11 @@ private:
WFPalette m_userPalette; WFPalette m_userPalette;
QHash<QString, QVariant> m_fMinPerBand; QHash<QString, QVariant> m_fMinPerBand;
double m_tr0;
double m_TRperiod;
qint32 m_waterfallAvg; qint32 m_waterfallAvg;
qint32 m_TRperiod;
qint32 m_nsps; qint32 m_nsps;
qint32 m_ntr0;
qint32 m_fMax; qint32 m_fMax;
qint32 m_nSubMode; qint32 m_nSubMode;
qint32 m_nsmo; qint32 m_nsmo;