diff --git a/CMakeLists.txt b/CMakeLists.txt index c0e4b0875..8f0397766 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -587,6 +587,7 @@ set (wsjt_FSRCS lib/fst4/fst4_baseline.f90 lib/77bit/hash22calc.f90 lib/superfox/sfox_wave.f90 + lib/superfox/sfox_wave_gfsk.f90 ) # temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit diff --git a/Modulator/Modulator.cpp b/Modulator/Modulator.cpp index 0d24485cd..b6fe7a988 100644 --- a/Modulator/Modulator.cpp +++ b/Modulator/Modulator.cpp @@ -70,9 +70,10 @@ void Modulator::start (QString mode, unsigned symbolsLength, double framesPerSym m_bFastMode=fastMode; m_TRperiod=TRperiod; unsigned delay_ms=1000; - if(mode=="FT8" or (mode=="FST4" and m_nsps==720)) delay_ms=500; //FT8, FST4-15 - if(mode=="Q65" and m_nsps<=3600) delay_ms=500; //Q65-15 and Q65-30 - if(mode=="FT4") delay_ms=300; //FT4 + if((mode=="FT8" and m_nsps==1920) or (mode=="FST4" and m_nsps==720)) delay_ms=500; //FT8, FST4-15 + if((mode=="FT8" and m_nsps==1024)) delay_ms=400; //SuperFox Qary Polar Code transmission + if(mode=="Q65" and m_nsps<=3600) delay_ms=500; //Q65-15 and Q65-30 + if(mode=="FT4") delay_ms=300; //FT4 // noise generator parameters if (m_addNoise) { diff --git a/Release_Notes.txt b/Release_Notes.txt index 87387efa5..808685a56 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -11,6 +11,70 @@ Copyright 2001 - 2024 by Joe Taylor, K1JT, and the WSJT Development Team + Release: WSJT-X 2.7.0-rc5 + July 1, 2024 + ------------------------- + +WSJT-X 2.7.0 Release Candidate 5 primarily introduces a new "SuperFox +and SuperHound" mode, a powerful new tool that helps DXpeditions to make +digital QSOs at very high rates. Furthermore, it brings some fixes and +other improvements. + +SuperFox and SuperHound mode: + + - The SuperFox mode behaves operationally like the present Fox and Hounds + but uses a constant envelope waveform for Fox’s transmissions rather + than sending concurrent streams of up to five normal FT8 signals. This + has the advantage that up to 9 messages can be transmitted without + getting a signal-strength penalty, resulting in a system gain of approx. + +10 dB compared to the conventional Fox/Hound operation with 5 slots! + + - Hounds chasing the DX station transmit normal FT8 signals, as in the + already familiar Fox and Hound mode. + + - Important: Hounds must use at least WSJT-X 2.7.0-rc5 to be able to + receive SuperFox messages. + + - When in SuperFox mode, Hound stations can call now also below 1000 Hz. + + - SuperFox Operation requires the Fox operator to use a valid key. Such + messages then contain a digital signature. Authorized keys will be + issued in advance for legitimate DXpeditions by the Northern California + DX Foundation. + + - Hounds will see the "Super Hound" label turn to green when a verified + SuperFox message arrives, as well as a "CALLSIGN verified" message. + + - Hound Operation should begin by selecting Special operating activity, + SuperFox, and Hound on the Settings / Advanced page. Alternatively, + right-clicking on the FT8 buttons toggles SuperFox mode on/off. + It works both when in Hound or in Fox mode. This allows quick switching + between SuperFox and the normal Fox and Hound operation. + + - SuperFox stations can send free text messages of up to 26 characters. + +Other enhancements: + + - Fixed a flaw that caused "Log automatically" to not work for the ARRL + Digi Contest mode. + + - Control elements for special operating activities are now disabled + if the respective function is not applicable. + + - Fixed a long-standing error that caused "Start new period decodes at + top" to stop working properly after some time. + + - Right-click mouse press events are now less error-prone. + + - Improved the readability of the first line when "Start new period + decodes at top" is checked. + + - 4-digit grids are now logged for certain contest modes to ensure that + the log complies with the contest rules. + + - The Fox Tx frequency is now saved and restored separately. + + Release: WSJT-X 2.7.0-rc4 March 11, 2024 ------------------------- diff --git a/lib/superfox/linux/foxchk b/lib/superfox/linux/foxchk index 50a7538a6..04bbd857f 100644 Binary files a/lib/superfox/linux/foxchk and b/lib/superfox/linux/foxchk differ diff --git a/lib/superfox/linux/sfrx b/lib/superfox/linux/sfrx index 3558dca8d..fb0e04fb9 100644 Binary files a/lib/superfox/linux/sfrx and b/lib/superfox/linux/sfrx differ diff --git a/lib/superfox/linux/sftx b/lib/superfox/linux/sftx index c8856d5f6..d338d6c83 100644 Binary files a/lib/superfox/linux/sftx and b/lib/superfox/linux/sftx differ diff --git a/lib/superfox/linux32/foxchk b/lib/superfox/linux32/foxchk index f29d4c92a..6fd4de86b 100644 Binary files a/lib/superfox/linux32/foxchk and b/lib/superfox/linux32/foxchk differ diff --git a/lib/superfox/linux32/sfrx b/lib/superfox/linux32/sfrx index 2f94dbd2d..9267d0aac 100644 Binary files a/lib/superfox/linux32/sfrx and b/lib/superfox/linux32/sfrx differ diff --git a/lib/superfox/linux32/sftx b/lib/superfox/linux32/sftx index b2d472040..6b7ff9522 100644 Binary files a/lib/superfox/linux32/sftx and b/lib/superfox/linux32/sftx differ diff --git a/lib/superfox/mac/foxchk b/lib/superfox/mac/foxchk index e4fe05ad2..87f81e0a8 100755 Binary files a/lib/superfox/mac/foxchk and b/lib/superfox/mac/foxchk differ diff --git a/lib/superfox/mac/sfrx b/lib/superfox/mac/sfrx index d38ec0d4a..efd744cc1 100755 Binary files a/lib/superfox/mac/sfrx and b/lib/superfox/mac/sfrx differ diff --git a/lib/superfox/mac/sftx b/lib/superfox/mac/sftx index 139555932..a821f1ccf 100755 Binary files a/lib/superfox/mac/sftx and b/lib/superfox/mac/sftx differ diff --git a/lib/superfox/sfox_wave_gfsk.f90 b/lib/superfox/sfox_wave_gfsk.f90 new file mode 100644 index 000000000..c0bd094c9 --- /dev/null +++ b/lib/superfox/sfox_wave_gfsk.f90 @@ -0,0 +1,78 @@ +subroutine sfox_wave_gfsk(fname) + +! Called by WSJT-X when it's time for SuperFox to transmit. Reads array +! itone(1:151) from disk file 'sfox_2.dat' in the writable data directory. +! Generates a GFSK waveform with short ramp-up and ramp-down symbols of +! duration NSPS/BT at the beginning and end of the waveform. + + parameter (NWAVE=(160+2)*134400*4) !Max WSJT-X waveform (FST4-1800 at 48kHz) + parameter (NSYM=151,NSPS=1024*4) + parameter (NPTS=(NSYM+2)*NSPS) + parameter (BT=8) + character*(*) fname + integer itone(151) + real*8 dt,twopi,f0,baud,phi,dphi_peak + real*8 dphi(0:NPTS-1) + real*8 pulse(3*NSPS) + logical first/.true./ + + common/foxcom/wave(NWAVE) + save first,twopi,dt,hmod,dphi_peak,pulse + + if(first) then + fsample=48000.0 + twopi=8.d0*atan(1.d0) + dt=1.d0/fsample + hmod=1.0 + dphi_peak=twopi*hmod/real(NSPS) + do i=1,3*NSPS + tt=(i-1.5*NSPS)/real(NSPS) + pulse(i)=gfsk_pulse(BT,tt) + enddo + first=.false. + endif + + open(25,file=trim(fname),status='unknown',err=999) + read(25,'(20i4)',err=999,end=999) itone + close(25) + if(itone(1).lt.0 .or. itone(1).gt.128) go to 999 + +! Generate the SuperFox waveform. + + dphi=0.d0 + do j=1,NSYM + ib=(j-1)*NSPS + ie=ib+3*NSPS-1 + dphi(ib:ie)=dphi(ib:ie)+dphi_peak*pulse(1:3*NSPS)*itone(j) + enddo + dphi(0:2*NSPS-1)=dphi(0:2*NSPS-1)+dphi_peak*itone(1)*pulse(NSPS+1:3*NSPS) + dphi(NSYM*NSPS:(NSYM+2)*NSPS-1)=dphi(NSYM*NSPS:(NSYM+2)*NSPS-1)+dphi_peak*itone(NSYM)*pulse(1:2*NSPS) + + wave=0. + phi=0.d0 + f0=750.0d0 + dphi=dphi+twopi*f0*dt + k=0 + do j=1,NSPS*(NSYM+2)-1 + k=k+1 + wave(k)=sin(phi) + phi=phi+dphi(j) + enddo + +! Add raised cosine ramps at the beginning and end of the waveform. +! Since the modulator expects an integral number of symbols, dummy +! symbols are added to the beginning and end of the waveform to +! hold the ramps. All but nramp of the samples in each dummy +! symbol will be zero. + + nramp=NSPS/BT + wave(1:NSPS-nramp)=0.0 + wave(NSPS-nramp+1:NSPS)=wave(NSPS-nramp+1:NSPS) * & + (1.0-cos(twopi*(/(i,i=0,nramp-1)/)/(2.0*nramp)))/2.0 + k1=(NSYM+1)*NSPS+1 + wave(k1:k1+nramp-1)=wave(k1:k1+nramp-1) * & + (1.0+cos(twopi*(/(i,i=0,nramp-1)/)/(2.0*nramp)))/2.0 + wave(k1+nramp:NPTS)=0.0 + +999 return +end subroutine sfox_wave_gfsk diff --git a/lib/superfox/win/foxchk.exe b/lib/superfox/win/foxchk.exe index 3fd7a5134..4c12548c2 100644 Binary files a/lib/superfox/win/foxchk.exe and b/lib/superfox/win/foxchk.exe differ diff --git a/lib/superfox/win/sfrx.exe b/lib/superfox/win/sfrx.exe index 20652caeb..d59c5c7eb 100644 Binary files a/lib/superfox/win/sfrx.exe and b/lib/superfox/win/sfrx.exe differ diff --git a/lib/superfox/win/sftx.exe b/lib/superfox/win/sftx.exe index 2acf44091..685b35e71 100644 Binary files a/lib/superfox/win/sftx.exe and b/lib/superfox/win/sftx.exe differ diff --git a/lib/superfox/win32/foxchk.exe b/lib/superfox/win32/foxchk.exe index cad5ad90b..130263170 100644 Binary files a/lib/superfox/win32/foxchk.exe and b/lib/superfox/win32/foxchk.exe differ diff --git a/lib/superfox/win32/sfrx.exe b/lib/superfox/win32/sfrx.exe index f547651e3..2bd5ea841 100644 Binary files a/lib/superfox/win32/sfrx.exe and b/lib/superfox/win32/sfrx.exe differ diff --git a/lib/superfox/win32/sftx.exe b/lib/superfox/win32/sftx.exe index 27ff433a8..add67ee29 100644 Binary files a/lib/superfox/win32/sftx.exe and b/lib/superfox/win32/sftx.exe differ diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f78412552..9bfc53cc2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -178,7 +178,7 @@ extern "C" { void foxgen_(bool* bSuperFox, char const * fname, FCL len); - void sfox_wave_(char const * fname, FCL len); + void sfox_wave_gfsk_(char const * fname, FCL len); void plotsave_(float swide[], int* m_w , int* m_h1, int* irow); @@ -4172,7 +4172,7 @@ void MainWindow::readFromStdout() //readFromStdout verified = true; ui->labDXped->setStyleSheet("QLabel {background-color: #00ff00; color: black;}"); } else { - verified = false; + if (decodedtext0.mid(5,2).contains("00") or decodedtext0.mid(5,2).contains("30")) verified = false; } if ((!verified && ui->labDXped->isVisible()) or ui->labDXped->text()!="Super Hound") ui->labDXped->setStyleSheet("QLabel {background-color: red; color: white;}"); @@ -11021,5 +11021,5 @@ void MainWindow::sfox_tx() p2.start(QDir::toNativeSeparators(m_appDir)+QDir::separator()+"sftx", args); p2.waitForFinished(); auto fname2 {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_2.dat")).toLocal8Bit()}; - sfox_wave_(fname2.constData(), (FCL)fname2.size()); + sfox_wave_gfsk_(fname2.constData(), (FCL)fname2.size()); } diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 218cef80d..c741a5582 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -50,7 +50,7 @@ #define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80 #define NUM_Q65_SYMBOLS 85 //63 data + 22 sync #define NUM_FT8_SYMBOLS 79 -#define NUM_SUPERFOX_SYMBOLS 151 +#define NUM_SUPERFOX_SYMBOLS 153 //24 sync + 127 data + 2 ramp up/down #define NUM_FT4_SYMBOLS 105 #define NUM_FST4_SYMBOLS 160 //240/2 data + 5*8 sync #define NUM_CW_SYMBOLS 250