Clean up js8d to jd8e to make it clear the difference

This commit is contained in:
Jordan Sherer 2019-11-06 16:00:16 -05:00
parent 9e77bc5d28
commit a43c913a19
16 changed files with 142 additions and 110 deletions

View File

@ -300,8 +300,8 @@ set (wsjt_FSRCS
lib/js8b_decode.f90
lib/js8c_module.f90
lib/js8c_decode.f90
lib/js8d_module.f90
lib/js8d_decode.f90
lib/js8e_module.f90
lib/js8e_decode.f90
# remaining non-module sources
lib/addit.f90
@ -417,7 +417,7 @@ set (wsjt_FSRCS
lib/ft8/ldpcsim174.f90
lib/js8/ldpcsim174js8b.f90
lib/js8/ldpcsim174js8c.f90
lib/js8/ldpcsim174js8d.f90
lib/js8/ldpcsim174js8e.f90
lib/ldpcsim40.f90
lib/libration.f90
lib/lorentzian.f90
@ -1001,8 +1001,8 @@ target_link_libraries (ldpcsim174js8b wsjt_fort wsjt_cxx)
add_executable (ldpcsim174js8c lib/js8/ldpcsim174js8c.f90 wsjtx.rc)
target_link_libraries (ldpcsim174js8c wsjt_fort wsjt_cxx)
add_executable (ldpcsim174js8d lib/js8/ldpcsim174js8d.f90 wsjtx.rc)
target_link_libraries (ldpcsim174js8d wsjt_fort wsjt_cxx)
add_executable (ldpcsim174js8e lib/js8/ldpcsim174js8e.f90 wsjtx.rc)
target_link_libraries (ldpcsim174js8e wsjt_fort wsjt_cxx)
add_executable (js8 ${js8_FSRCS} ${js8_CXXSRCS} wsjtx.rc)
if (${OPENMP_FOUND} OR APPLE)

View File

@ -81,8 +81,8 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
else if(m_TRperiod == JS8C_TX_SECONDS){
delay_ms = JS8C_START_DELAY_MS;
}
else if(m_TRperiod == JS8D_TX_SECONDS){
delay_ms = JS8D_START_DELAY_MS;
else if(m_TRperiod == JS8E_TX_SECONDS){
delay_ms = JS8E_START_DELAY_MS;
}
// noise generator parameters

View File

@ -15,7 +15,7 @@
#define JS8_ENABLE_JS8A 1
#define JS8_ENABLE_JS8B 1
#define JS8_ENABLE_JS8C 1
#define JS8_ENABLE_JS8D 0
#define JS8_ENABLE_JS8E 0
#define JS8A_SYMBOL_SAMPLES 1920
#define JS8A_TX_SECONDS 15
@ -29,15 +29,15 @@
#define JS8C_TX_SECONDS 6
#define JS8C_START_DELAY_MS 100
#define JS8D_IS_ULTRA 1
#if JS8D_IS_ULTRA
#define JS8D_SYMBOL_SAMPLES 384
#define JS8D_TX_SECONDS 4
#define JS8D_START_DELAY_MS 100
#define JS8E_IS_ULTRA 0
#if JS8E_IS_ULTRA
#define JS8E_SYMBOL_SAMPLES 384
#define JS8E_TX_SECONDS 4
#define JS8E_START_DELAY_MS 100
#else
#define JS8D_SYMBOL_SAMPLES 4000
#define JS8D_TX_SECONDS 30
#define JS8D_START_DELAY_MS 100
#define JS8E_SYMBOL_SAMPLES 4000
#define JS8E_TX_SECONDS 30
#define JS8E_START_DELAY_MS 100
#endif
#ifndef TEST_FOX_WAVE_GEN
@ -95,11 +95,11 @@ extern struct dec_data {
int kposA; // starting position of decode for submode A
int kposB; // starting position of decode for submode B
int kposC; // starting position of decode for submode C
int kposD; // starting position of decode for submode D
int kposE; // starting position of decode for submode E
int kszA; // number of frames for decode for submode A
int kszB; // number of frames for decode for submode B
int kszC; // number of frames for decode for submode C
int kszD; // number of frames for decode for submode D
int kszE; // number of frames for decode for submode E
int nzhsym; // half symbol stop index
int nsubmode;
int nsubmodes;

View File

@ -264,7 +264,7 @@ bool DecodedText::tryUnpackFastData(){
return false;
}
if(submode_ != Varicode::JS8CallFast && submode_ != Varicode::JS8CallTurbo && submode_ != Varicode::JS8CallUltra){
if(submode_ != Varicode::JS8CallFast && submode_ != Varicode::JS8CallTurbo && submode_ != Varicode::JS8CallUltraSlow){
return false;
}

View File

@ -6,7 +6,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
use ft8_decode
use js8b_decode
use js8c_decode
use js8d_decode
use js8e_decode
include 'jt9com.f90'
include 'timer_common.inc'
@ -23,9 +23,9 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
integer :: decoded
end type counting_js8c_decoder
type, extends(js8d_decoder) :: counting_js8d_decoder
type, extends(js8e_decoder) :: counting_js8e_decoder
integer :: decoded
end type counting_js8d_decoder
end type counting_js8e_decoder
real ss(184,NSMAX)
logical baddata,newdat65,newdat9,single_decode,bVHF,bad0,newdat,trydecode
@ -39,7 +39,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
type(counting_ft8_decoder) :: my_js8a
type(counting_js8b_decoder) :: my_js8b
type(counting_js8c_decoder) :: my_js8c
type(counting_js8d_decoder) :: my_js8d
type(counting_js8e_decoder) :: my_js8e
!cast C character arrays to Fortran character strings
datetime=transfer(params%datetime, datetime)
@ -52,7 +52,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
my_js8a%decoded = 0
my_js8b%decoded = 0
my_js8c%decoded = 0
my_js8d%decoded = 0
my_js8e%decoded = 0
single_decode=iand(params%nexp_decode,32).ne.0
bVHF=iand(params%nexp_decode,64).ne.0
@ -82,23 +82,23 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
trydecode=.false.
if(params%nmode.eq.8 .and. (params%nsubmode.eq.4 .or. iand(params%nsubmodes, 8).eq.8)) then
! We're in JS8 mode D
call timer('decjs8d ',0)
! We're in JS8 mode E
call timer('decjs8e ',0)
newdat=params%newdat
trydecode=.true.
! copy the relevant frames for decoding
pos = params%kposD
sz = params%kszD
pos = params%kposE
sz = params%kszE
id0=0
id0(1:sz+1)=id2(pos+1:pos+sz+1)
call my_js8d%decode(js8d_decoded,id0,params%nQSOProgress,params%nfqso, &
call my_js8e%decode(js8e_decoded,id0,params%nQSOProgress,params%nfqso, &
params%nftx,newdat,params%nutc,params%nfa,params%nfb, &
params%nexp_decode,params%ndepth,logical(params%nagain), &
logical(params%lft8apon),logical(params%lapcqonly),params%napwid, &
mycall,mygrid,hiscall,hisgrid)
call timer('decjs8d ',1)
call timer('decjs8e ',1)
endif
if(params%nmode.eq.8 .and. (params%nsubmode.eq.2 .or. iand(params%nsubmodes, 4).eq.4)) then
@ -202,7 +202,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
!$call omp_set_dynamic(.true.)
800 ndecoded = my_js8a%decoded + my_js8b%decoded + my_js8c%decoded + my_js8d%decoded
800 ndecoded = my_js8a%decoded + my_js8b%decoded + my_js8c%decoded + my_js8e%decoded
write(*,1010) nsynced,ndecoded
1010 format('<DecodeFinished>',2i4)
call flush(6)
@ -260,7 +260,7 @@ contains
if(submode.eq.0) m=' A '
if(submode.eq.1) m=' B '
if(submode.eq.2) m=' C '
if(submode.eq.3) m=' D '
if(submode.eq.4) m=' E '
i0=index(decoded0,';')
@ -317,9 +317,11 @@ contains
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
integer :: submode
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, 0)
submode=0
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, submode)
select type(this)
type is (counting_ft8_decoder)
@ -341,9 +343,11 @@ contains
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
integer :: submode
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, 1)
submode=1
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, submode)
select type(this)
type is (counting_js8b_decoder)
@ -365,9 +369,11 @@ contains
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
integer :: submode
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, 2)
submode=2
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, submode)
select type(this)
type is (counting_js8c_decoder)
@ -377,11 +383,11 @@ contains
return
end subroutine js8c_decoded
subroutine js8d_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use js8d_decode
subroutine js8e_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use js8e_decode
implicit none
class(js8d_decoder), intent(inout) :: this
class(js8e_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
@ -389,16 +395,18 @@ contains
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
integer :: submode
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, 3)
submode=4
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual, submode)
select type(this)
type is (counting_js8d_decoder)
type is (counting_js8e_decoder)
this%decoded = this%decoded + 1
end select
return
end subroutine js8d_decoded
end subroutine js8e_decoded
end subroutine multimode_decoder

View File

@ -4,7 +4,7 @@ use crc
use packjt
include 'js8_params.f90'
include 'js8d_params.f90'
include 'js8e_params.f90'
character*22 msg,msgsent,msgreceived
character*8 arg

View File

@ -1,16 +1,16 @@
module js8d_decode
module js8e_decode
type :: js8d_decoder
procedure(js8d_decode_callback), pointer :: callback
type :: js8e_decoder
procedure(js8e_decode_callback), pointer :: callback
contains
procedure :: decode
end type js8d_decoder
end type js8e_decoder
abstract interface
subroutine js8d_decode_callback (this,sync,snr,dt,freq,decoded,nap,qual)
import js8d_decoder
subroutine js8e_decode_callback (this,sync,snr,dt,freq,decoded,nap,qual)
import js8e_decoder
implicit none
class(js8d_decoder), intent(inout) :: this
class(js8e_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
@ -18,7 +18,7 @@ module js8d_decode
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
end subroutine js8d_decode_callback
end subroutine js8e_decode_callback
end interface
contains
@ -29,10 +29,10 @@ contains
! use wavhdr
use timer_module, only: timer
! type(hdr) h
use js8d_module
use js8e_module
class(js8d_decoder), intent(inout) :: this
procedure(js8d_decode_callback) :: callback
class(js8e_decoder), intent(inout) :: this
procedure(js8e_decode_callback) :: callback
real s(NH1,NHSYM)
real sbase(NH1)
real candidate(3,200)
@ -153,4 +153,4 @@ contains
return
end subroutine decode
end module js8d_decode
end module js8e_decode

View File

@ -1,6 +1,6 @@
module js8d_module
module js8e_module
include 'js8/js8_params.f90'
include 'js8/js8d_params.f90'
include 'js8/js8e_params.f90'
contains
include 'js8/baselinejs8.f90'
@ -10,4 +10,4 @@ contains
include 'js8/genjs8refsig.f90'
include 'js8/subtractjs8.f90'
include 'js8/js8dec.f90'
end module js8d_module
end module js8e_module

View File

@ -290,7 +290,7 @@ program jt9
shared_data%params%kszA=NMAX-1
shared_data%params%kszB=NMAX-1
shared_data%params%kszC=NMAX-1
shared_data%params%kszD=NMAX-1
shared_data%params%kszE=NMAX-1
call multimode_decoder(shared_data%ss,shared_data%id2,shared_data%params,nfsample)
enddo

View File

@ -22,11 +22,11 @@
integer(c_int) :: kposA
integer(c_int) :: kposB
integer(c_int) :: kposC
integer(c_int) :: kposD
integer(c_int) :: kposE
integer(c_int) :: kszA
integer(c_int) :: kszB
integer(c_int) :: kszC
integer(c_int) :: kszD
integer(c_int) :: kszE
integer(c_int) :: nzhsym
integer(c_int) :: nsubmode
integer(c_int) :: nsubmodes

View File

@ -1007,7 +1007,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
ui->actionModeJS8Normal->setActionGroup(modeActionGroup);
ui->actionModeJS8Fast->setActionGroup(modeActionGroup);
ui->actionModeJS8Turbo->setActionGroup(modeActionGroup);
ui->actionModeJS8Ultra->setActionGroup(modeActionGroup);
ui->actionModeJS8UltraSlow->setActionGroup(modeActionGroup);
auto mbmp = new MousePressEater();
connect(mbmp, &MousePressEater::mousePressed, this, [this](QObject *, QMouseEvent * e, bool *pProcessed){
@ -1024,8 +1024,14 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
if(!JS8_ENABLE_JS8C){
ui->actionModeJS8Turbo->setVisible(false);
}
if(!JS8_ENABLE_JS8D){
ui->actionModeJS8Ultra->setVisible(false);
if(!JS8_ENABLE_JS8E){
ui->actionModeJS8UltraSlow->setVisible(false);
}
if(JS8_ENABLE_JS8E && !JS8E_IS_ULTRA){
// 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)");
}
// prep
@ -2488,7 +2494,7 @@ int MainWindow::computeSubmodePeriod(int submode){
case Varicode::JS8CallNormal: return JS8A_TX_SECONDS;
case Varicode::JS8CallFast: return JS8B_TX_SECONDS;
case Varicode::JS8CallTurbo: return JS8C_TX_SECONDS;
case Varicode::JS8CallUltra: return JS8D_TX_SECONDS;
case Varicode::JS8CallUltraSlow: return JS8E_TX_SECONDS;
}
return 0;
@ -2518,7 +2524,16 @@ int MainWindow::computeStop(int submode, int period){
case Varicode::JS8CallNormal: symbolSamples = JS8A_SYMBOL_SAMPLES; /* threshold = 1.00 */ ; break;
case Varicode::JS8CallFast: symbolSamples = JS8B_SYMBOL_SAMPLES; /* threshold = 1.08 */ ; break;
case Varicode::JS8CallTurbo: symbolSamples = JS8C_SYMBOL_SAMPLES; /* threshold = 0.50 */ ; break;
case Varicode::JS8CallUltra: symbolSamples = JS8D_SYMBOL_SAMPLES; threshold = 0.00; break;
case Varicode::JS8CallUltraSlow:
{
symbolSamples = JS8E_SYMBOL_SAMPLES;
#if JS8E_IS_ULTRA
threshold = 0.00;
#endif
break;
}
}
stop = qFloor(float(symbolSamples*JS8_NUM_SYMBOLS + threshold*RX_SAMPLE_RATE)/(float)m_nsps*2.0);
#endif
@ -2742,7 +2757,7 @@ void MainWindow::on_menuModeJS8_aboutToShow(){
ui->actionModeJS8Normal->setEnabled(canChangeMode);
ui->actionModeJS8Fast->setEnabled(canChangeMode);
ui->actionModeJS8Turbo->setEnabled(canChangeMode);
ui->actionModeJS8Ultra->setEnabled(canChangeMode);
ui->actionModeJS8UltraSlow->setEnabled(canChangeMode);
}
void MainWindow::on_menuControl_aboutToShow(){
@ -3244,7 +3259,7 @@ void MainWindow::setSubmode(int submode){
ui->actionModeJS8Normal->setChecked(submode == Varicode::JS8CallNormal);
ui->actionModeJS8Fast->setChecked(submode == Varicode::JS8CallFast);
ui->actionModeJS8Turbo->setChecked(submode == Varicode::JS8CallTurbo);
ui->actionModeJS8Ultra->setChecked(submode == Varicode::JS8CallUltra);
ui->actionModeJS8UltraSlow->setChecked(submode == Varicode::JS8CallUltraSlow);
on_actionJS8_triggered();
}
@ -3258,8 +3273,8 @@ int MainWindow::speedNameMode(QString speed){
if(speed == modeSpeedName(Varicode::JS8CallTurbo)){
return Varicode::JS8CallTurbo;
}
if(speed == modeSpeedName(Varicode::JS8CallUltra)){
return Varicode::JS8CallUltra;
if(speed == modeSpeedName(Varicode::JS8CallUltraSlow)){
return Varicode::JS8CallUltraSlow;
}
return -1;
}
@ -3275,8 +3290,8 @@ QString MainWindow::modeSpeedName(int submode){
else if(submode == Varicode::JS8CallTurbo){
return "TURBO";
}
else if(submode == Varicode::JS8CallUltra){
#ifdef JS8D_IS_ULTRA
else if(submode == Varicode::JS8CallUltraSlow){
#if JS8E_IS_ULTRA
return "ULTRA";
#else
return "SLOW";
@ -3981,53 +3996,53 @@ bool MainWindow::decodeReady(int submode, int period, int *pSubmode, int *pPerio
qint32 framesNeededC = computeFramesNeededForDecode(Varicode::JS8CallTurbo, JS8C_TX_SECONDS);
bool couldDecodeC = k >= cycleSampleStartC + framesNeededC;
#if JS8_ENABLE_JS8D
qint32 cycleSampleStartD = computeCycleStartForDecode(computeCurrentCycle(JS8D_TX_SECONDS), JS8D_TX_SECONDS);
qint32 framesNeededD = computeFramesNeededForDecode(Varicode::JS8CallUltra, JS8D_TX_SECONDS);
bool couldDecodeD = k >= cycleSampleStartD + framesNeededD;
#if JS8_ENABLE_JS8E
qint32 cycleSampleStartE = computeCycleStartForDecode(computeCurrentCycle(JS8E_TX_SECONDS), JS8E_TX_SECONDS);
qint32 framesNeededE = computeFramesNeededForDecode(Varicode::JS8CallUltraSlow, JS8E_TX_SECONDS);
bool couldDecodeE = k >= cycleSampleStartE + framesNeededE;
#else
qint32 cycleSampleStartD = 0;
qint32 framesNeededD = 0;
bool couldDecodeD = false;
qint32 cycleSampleStartE = 0;
qint32 framesNeededE = 0;
bool couldDecodeE = false;
#endif
if(m_diskData){
dec_data.params.kposA = 0;
dec_data.params.kposB = 0;
dec_data.params.kposC = 0;
dec_data.params.kposD = 0;
dec_data.params.kposE = 0;
dec_data.params.kszA = NTMAX*RX_SAMPLE_RATE-1;
dec_data.params.kszB = NTMAX*RX_SAMPLE_RATE-1;
dec_data.params.kszC = NTMAX*RX_SAMPLE_RATE-1;
dec_data.params.kszD = NTMAX*RX_SAMPLE_RATE-1;
dec_data.params.kszE = NTMAX*RX_SAMPLE_RATE-1;
dec_data.params.nsubmodes = 0;
couldDecodeA = true;
couldDecodeB = true;
couldDecodeC = true;
#if JS8_ENABLE_JS8D
couldDecodeD = true;
#if JS8_ENABLE_JS8E
couldDecodeE = true;
#endif
} else {
// set the params for starting positions and sizes for decode
dec_data.params.kposA = cycleSampleStartA;
dec_data.params.kposB = cycleSampleStartB;
dec_data.params.kposC = cycleSampleStartC;
dec_data.params.kposD = cycleSampleStartD;
dec_data.params.kposE = cycleSampleStartE;
dec_data.params.kszA = qMax(framesNeededA, k-cycleSampleStartA);
dec_data.params.kszB = qMax(framesNeededB, k-cycleSampleStartB);
dec_data.params.kszC = qMax(framesNeededC, k-cycleSampleStartC);
dec_data.params.kszD = qMax(framesNeededD, k-cycleSampleStartD);
dec_data.params.kszE = qMax(framesNeededE, k-cycleSampleStartE);
dec_data.params.nsubmodes = 0;
}
bool multi = ui->actionModeMultiDecoder->isChecked();
int decodes = 0;
if(couldDecodeD && (multi || submode == Varicode::JS8CallUltra)){
qDebug() << "could decode D from" << cycleSampleStartD << "to" << cycleSampleStartD + framesNeededD;
submode = Varicode::JS8CallUltra;
period = JS8D_TX_SECONDS;
dec_data.params.nsubmodes |= (Varicode::JS8CallUltra << 1);
if(couldDecodeE && (multi || submode == Varicode::JS8CallUltraSlow)){
qDebug() << "could decode E from" << cycleSampleStartE << "to" << cycleSampleStartE + framesNeededE;
submode = Varicode::JS8CallUltraSlow;
period = JS8E_TX_SECONDS;
dec_data.params.nsubmodes |= (Varicode::JS8CallUltraSlow << 1);
decodes++;
}
if(couldDecodeC && (multi || submode == Varicode::JS8CallTurbo)){
@ -4212,8 +4227,8 @@ bool MainWindow::decodeReady(int submode, int period, int *pSubmode, int *pPerio
frames = dec_data.params.kszC;
}
else if(m_nSubMode == Varicode::JS8CallUltra){
start = dec_data.params.kposD;
frames = dec_data.params.kszD;
start = dec_data.params.kposE;
frames = dec_data.params.kszE;
}
memcpy(dec_data.d1, dec_data.d2 + start, sizeof(dec_data.d2[0]) * frames);
#endif
@ -5056,8 +5071,8 @@ void MainWindow::guiUpdate()
txDuration=JS8B_START_DELAY_MS/1000.0 + JS8_NUM_SYMBOLS * (double)JS8B_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE;
} else if(m_nSubMode == Varicode::JS8CallTurbo){
txDuration=JS8C_START_DELAY_MS/1000.0 + JS8_NUM_SYMBOLS * (double)JS8C_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE;
} else if(m_nSubMode == Varicode::JS8CallUltra){
txDuration=JS8D_START_DELAY_MS/1000.0 + JS8_NUM_SYMBOLS * (double)JS8D_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE;
} else if(m_nSubMode == Varicode::JS8CallUltraSlow){
txDuration=JS8E_START_DELAY_MS/1000.0 + JS8_NUM_SYMBOLS * (double)JS8E_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE;
}
}
@ -5143,8 +5158,8 @@ void MainWindow::guiUpdate()
else if(m_nSubMode == Varicode::JS8CallTurbo){
ratio = (((double)m_TRperiod - (JS8_NUM_SYMBOLS*(double)JS8C_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE))/(double)m_TRperiod);
}
else if(m_nSubMode == Varicode::JS8CallUltra){
ratio = (((double)m_TRperiod - (JS8_NUM_SYMBOLS*(double)JS8D_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE))/(double)m_TRperiod);
else if(m_nSubMode == Varicode::JS8CallUltraSlow){
ratio = (((double)m_TRperiod - (JS8_NUM_SYMBOLS*(double)JS8E_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE))/(double)m_TRperiod);
}
if(fTR > 1.0-ratio && fTR < 1.0){
@ -5231,7 +5246,7 @@ void MainWindow::guiUpdate()
qDebug() << "gen ft8";
genft8_(message, MyGrid, &bcontest, &m_i3bit, msgsent, const_cast<char *> (ft8msgbits),
const_cast<int *> (itone), 22, 6, 22);
} else if (m_nSubMode == Varicode::JS8CallFast || m_nSubMode == Varicode::JS8CallTurbo || m_nSubMode == Varicode::JS8CallUltra){
} else if (m_nSubMode == Varicode::JS8CallFast || m_nSubMode == Varicode::JS8CallTurbo || m_nSubMode == Varicode::JS8CallUltraSlow){
qDebug() << "gen js8";
genjs8_(message, MyGrid, &bcontest, &m_i3bit, msgsent, const_cast<char *> (ft8msgbits),
const_cast<int *> (itone), 22, 6, 22);
@ -7173,7 +7188,7 @@ void MainWindow::on_actionModeJS8Turbo_triggered(){
on_actionJS8_triggered();
}
void MainWindow::on_actionModeJS8Ultra_triggered(){
void MainWindow::on_actionModeJS8UltraSlow_triggered(){
on_actionJS8_triggered();
}
@ -7235,8 +7250,8 @@ void MainWindow::on_actionJS8_triggered()
else if(ui->actionModeJS8Turbo->isChecked()){
m_nSubMode=Varicode::JS8CallTurbo;
}
else if(ui->actionModeJS8Ultra->isChecked()){
m_nSubMode=Varicode::JS8CallUltra;
else if(ui->actionModeJS8UltraSlow->isChecked()){
m_nSubMode=Varicode::JS8CallUltraSlow;
}
// Only enable heartbeat for normal mode
@ -7272,7 +7287,12 @@ void MainWindow::on_actionJS8_triggered()
#if JS8_RING_BUFFER
Q_ASSERT(NTMAX == 60);
m_wideGraph->setPeriod(m_TRperiod, m_nsps);
#if JS8_ENABLE_JS8E && !JS8E_IS_ULTRA
m_detector->setTRPeriod(NTMAX); // TODO - not thread safe
#else
m_detector->setTRPeriod(NTMAX / 2); // TODO - not thread safe
#endif
#else
m_wideGraph->setPeriod(m_TRperiod, m_nsps);
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
@ -9313,9 +9333,9 @@ void MainWindow::transmit (double snr)
symbolSamples=(double)JS8C_SYMBOL_SAMPLES;
toneSpacing=(double)RX_SAMPLE_RATE/(double)JS8C_SYMBOL_SAMPLES;
}
else if(m_nSubMode == Varicode::JS8CallUltra){
symbolSamples=(double)JS8D_SYMBOL_SAMPLES;
toneSpacing=(double)RX_SAMPLE_RATE/(double)JS8D_SYMBOL_SAMPLES;
else if(m_nSubMode == Varicode::JS8CallUltraSlow){
symbolSamples=(double)JS8E_SYMBOL_SAMPLES;
toneSpacing=(double)RX_SAMPLE_RATE/(double)JS8E_SYMBOL_SAMPLES;
}
if(m_config.x2ToneSpacing()) toneSpacing*=2.0;
if(m_config.x4ToneSpacing()) toneSpacing*=4.0;
@ -9583,6 +9603,9 @@ int MainWindow::rxThreshold(){
int threshold = 10;
if(m_nSubMode == Varicode::JS8CallFast){ threshold = 16; }
if(m_nSubMode == Varicode::JS8CallTurbo){ threshold = 32; }
#if JS8E_IS_ULTRA
if(m_nSubMode == Varicode::JS8CallUltraSlow){ threshold = 50; }
#endif
return threshold;
}
@ -12350,8 +12373,8 @@ void MainWindow::networkMessage(Message const &message)
if(speed == Varicode::JS8CallTurbo){
ui->actionModeJS8Turbo->setChecked(true);
}
if(speed == Varicode::JS8CallUltra){
ui->actionModeJS8Ultra->setChecked(true);
if(speed == Varicode::JS8CallUltraSlow){
ui->actionModeJS8UltraSlow->setChecked(true);
}
}
sendNetworkMessage("MODE.SPEED", "", {

View File

@ -269,7 +269,7 @@ private slots:
void on_actionModeJS8Normal_triggered();
void on_actionModeJS8Fast_triggered();
void on_actionModeJS8Turbo_triggered();
void on_actionModeJS8Ultra_triggered();
void on_actionModeJS8UltraSlow_triggered();
void on_actionHeartbeatAcknowledgements_toggled(bool checked);
void on_actionModeMultiDecoder_toggled(bool checked);
void on_actionModeAutoreply_toggled(bool checked);

View File

@ -4791,7 +4791,7 @@ list. The list can be maintained in Settings (F2).</string>
<addaction name="actionModeJS8Normal"/>
<addaction name="actionModeJS8Fast"/>
<addaction name="actionModeJS8Turbo"/>
<addaction name="actionModeJS8Ultra"/>
<addaction name="actionModeJS8UltraSlow"/>
<addaction name="separator"/>
<addaction name="menu_Decode_Passes"/>
<addaction name="actionModeMultiDecoder"/>
@ -5722,7 +5722,7 @@ list. The list can be maintained in Settings (F2).</string>
<string>JS8 (&amp;Turbo, 6s, 160Hz, ~40 WPM)</string>
</property>
</action>
<action name="actionModeJS8Ultra">
<action name="actionModeJS8UltraSlow">
<property name="checkable">
<bool>true</bool>
</property>

View File

@ -422,8 +422,8 @@ void CPlotter::DrawOverlay() //DrawOverlay()
else if(m_nSubMode == Varicode::JS8CallTurbo){
bw = 8.0*(double)RX_SAMPLE_RATE/(double)JS8C_SYMBOL_SAMPLES;
}
else if(m_nSubMode == Varicode::JS8CallUltra){
bw = 8.0*(double)RX_SAMPLE_RATE/(double)JS8D_SYMBOL_SAMPLES;
else if(m_nSubMode == Varicode::JS8CallUltraSlow){
bw = 8.0*(double)RX_SAMPLE_RATE/(double)JS8E_SYMBOL_SAMPLES;
}
painter0.setPen(penGreen);

View File

@ -28,7 +28,8 @@ public:
JS8CallNormal = 0,
JS8CallFast = 1,
JS8CallTurbo = 2,
JS8CallUltra = 4
JS8CallSlow = 4,
JS8CallUltraSlow = 4
};
// frame type transmitted via itype and decoded by the ft8 decoded