diff --git a/commons.h b/commons.h index 17fc89d..348852c 100644 --- a/commons.h +++ b/commons.h @@ -35,7 +35,7 @@ #define JS8E_TX_SECONDS 4 #define JS8E_START_DELAY_MS 100 #else -#define JS8E_SYMBOL_SAMPLES 4000 +#define JS8E_SYMBOL_SAMPLES 3840 #define JS8E_TX_SECONDS 30 #define JS8E_START_DELAY_MS 500 #endif diff --git a/lib/js8/js8e_params.f90 b/lib/js8/js8e_params.f90 index b4a30fe..e0e0632 100644 --- a/lib/js8/js8e_params.f90 +++ b/lib/js8/js8e_params.f90 @@ -17,7 +17,8 @@ ! parameter (NSPS=960, NTXDUR=8, NDOWNSPS=24, NDD=100, JZ=116) ! 100 Hz 12.50 baud 32 wpm -22.0dB (1.0Eb/N0) 5.92s ! parameter (NSPS=1200, NTXDUR=10, NDOWNSPS=20, NDD=100, JZ=116) ! 80 Hz 10 baud 24 wpm -23.0dB (1.0Eb/N0) 7.90s ! parameter (NSPS=1920, NTXDUR=15, NDOWNSPS=32, NDD=100, JZ=116) ! 50 Hz 6.250 baud 16 wpm -25.0dB (1.0Eb/N0) 12.64s - parameter (NSPS=4000, NTXDUR=30, NDOWNSPS=40, NDD=90, JZ=116) ! 24 Hz 3 baud 8 wpm -28.2dB (1.0Eb/N0) 26.33s + parameter (NSPS=3840, NTXDUR=30, NDOWNSPS=32, NDD=94, JZ=116) ! 24 Hz 3.125 baud 8 wpm -28.0dB (1.0Eb/N0) 25.28s +! parameter (NSPS=4000, NTXDUR=30, NDOWNSPS=40, NDD=90, JZ=116) ! 24 Hz 3 baud 8 wpm -28.2dB (1.0Eb/N0) 26.33s parameter (AZ=12000.0/(1.0*NSPS)*0.8d0) !Dedupe overlap in Hz parameter (ASTART=0.5) !Start delay in seconds diff --git a/mainwindow.cpp b/mainwindow.cpp index 50ae4b8..f247609 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1031,7 +1031,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, // reorder so slow is at the top ui->menuModeJS8->removeAction(ui->actionModeJS8UltraSlow); ui->menuModeJS8->insertAction(ui->actionModeJS8Normal, ui->actionModeJS8UltraSlow); - ui->actionModeJS8UltraSlow->setText("JS8 (&Slow, 30s, 24Hz, ~8WPM)"); + ui->actionModeJS8UltraSlow->setText("JS8 (&Slow, 30s, 25Hz, ~8WPM)"); } // prep @@ -2491,9 +2491,9 @@ void MainWindow::fixStop() int MainWindow::computeSubmodePeriod(int submode){ switch(submode){ - case Varicode::JS8CallNormal: return JS8A_TX_SECONDS; - case Varicode::JS8CallFast: return JS8B_TX_SECONDS; - case Varicode::JS8CallTurbo: return JS8C_TX_SECONDS; + case Varicode::JS8CallNormal: return JS8A_TX_SECONDS; + case Varicode::JS8CallFast: return JS8B_TX_SECONDS; + case Varicode::JS8CallTurbo: return JS8C_TX_SECONDS; case Varicode::JS8CallUltraSlow: return JS8E_TX_SECONDS; } @@ -4003,16 +4003,15 @@ bool MainWindow::decodeReady(int submode, int period, int *pSubmode, int *pPerio qint32 cycleSampleStartE = computeCycleStartForDecode(cycleE, JS8E_TX_SECONDS); qint32 framesNeededE = computeFramesNeededForDecode(Varicode::JS8CallUltraSlow, JS8E_TX_SECONDS); bool couldDecodeE = k >= cycleSampleStartE + framesNeededE; -#if !JS8E_IS_ULTRA - static int lastE = -1; + + // protect against multiple decodes for the same cycle + static int lastDecodeCycleE = -1; if(couldDecodeE){ - if(cycleE == lastE){ + if(cycleE == lastDecodeCycleE){ couldDecodeE = false; } - lastE = cycleE; + lastDecodeCycleE = cycleE; } -#endif - #else qint32 cycleSampleStartE = 0; qint32 framesNeededE = 0; @@ -4504,7 +4503,7 @@ void MainWindow::readFromStdout() //readFromStdout DecodedText decodedtext {QString::fromUtf8 (t.constData ()).remove (QRegularExpression {"\r|\n"}), "FT8" == m_mode && ui->cbVHFcontest->isChecked(), m_config.my_grid ()}; - bool bValidFrame = decodedtext.snr() > -24; + bool bValidFrame = decodedtext.snr() > -28; // dupe check auto frame = decodedtext.message(); @@ -7220,7 +7219,7 @@ void MainWindow::prepareHeartbeatMode(bool enabled){ ui->hbMacroButton->setChecked(false); } ui->actionHeartbeat->setEnabled(enabled); - ui->actionModeJS8HB->setEnabled(m_nSubMode == Varicode::JS8CallNormal); + ui->actionModeJS8HB->setEnabled(m_nSubMode == Varicode::JS8CallNormal || (!JS8E_IS_ULTRA && m_nSubMode == Varicode::JS8CallUltraSlow)); ui->actionHeartbeatAcknowledgements->setEnabled(ui->actionModeAutoreply->isChecked() && enabled); #if 0 @@ -7268,7 +7267,7 @@ void MainWindow::on_actionJS8_triggered() } // Only enable heartbeat for normal mode - ui->actionModeJS8HB->setEnabled(m_nSubMode == Varicode::JS8CallNormal); + ui->actionModeJS8HB->setEnabled(m_nSubMode == Varicode::JS8CallNormal || (!JS8E_IS_ULTRA && m_nSubMode == Varicode::JS8CallUltraSlow)); prepareHeartbeatMode(ui->actionModeJS8HB->isEnabled() && ui->actionModeJS8HB->isChecked()); //if(m_nSubMode != Varicode::JS8CallNormal){ diff --git a/varicode.h b/varicode.h index 4d6f4ee..6e8c71b 100644 --- a/varicode.h +++ b/varicode.h @@ -25,11 +25,10 @@ public: // submode types enum SubmodeType { - JS8CallNormal = 0, - JS8CallFast = 1, - JS8CallTurbo = 2, - JS8CallSlow = 4, - JS8CallUltraSlow = 4 + JS8CallNormal = 0, + JS8CallFast = 1, + JS8CallTurbo = 2, + JS8CallUltraSlow = 4 }; // frame type transmitted via itype and decoded by the ft8 decoded