diff --git a/CMakeLists.txt b/CMakeLists.txt index 4765fd06e..80866a67e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -493,6 +493,7 @@ set (wsjt_FSRCS lib/msk144sim.f90 lib/mskrtd.f90 lib/nuttal_window.f90 + lib/decode_msk144.f90 lib/ft4/ft4sim.f90 lib/ft4/ft4sim_mult.f90 lib/ft4/ft4_downsample.f90 diff --git a/Configuration.cpp b/Configuration.cpp index 216d09b39..6c387bcbd 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -244,7 +244,9 @@ namespace |X85|X86|X87|X88|X89|X90|X91 |X92|X93|X94|X95|X96|X97|X98 |X99 - |[0-9][0-9][0-9][0-9] # 4-digit numbers + |[0][0][0][1-9] # 4-digit numbers + |[0][0-9][1-9][0-9] # between 0001 + |[1-7][0-9][0-9][0-9] # and 7999 ) )", QRegularExpression::CaseInsensitiveOption | QRegularExpression::ExtendedPatternSyntaxOption}; diff --git a/NEWS b/NEWS index 046b2bdb9..977249765 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,63 @@ Copyright 2001 - 2024 by Joe Taylor, K1JT, and the WSJT Development Team + Release: WSJT-X 2.7.0-rc3 + January 1, 2024 + ------------------------- + +WSJT-X 2.7.0 Release Candidate 3 brings some new features, as well as +numerous detail improvements and bug fixes, such as: + + - Added a new "Update Hamlib" function. On Windows, it allows the user to + update Hamlib directly from the program. The previously used version is + backed up, so the user can easily revert a hamlib update. + + - The Hamlib version in use is now displayed (also on Linux and macOS). + + - The FT Roundup Messages protocol has been enhanced. It now allows also + the exchange of static 4-digit numbers instead of serial numbers. This + extends the usability of the FT RU protocol for other contest types. + + - Improved direct switching between modes. Submode, as well as the status + of the "Sh" and "Fast" checkboxes are now saved and restored by mode. + + - Some right-click events were made more intuitive and consistent. + - Right-clicking the Q65 button enables Q65 Pileup mode, a left-click + brings you back to the normal Q65 mode. + - Right-click the JT65 button to switch to JT9 mode. + + - For Q65, all messages for us are now displayed in the right window. + + - Message averaging is now allowed only when VHF features are + enabled, and label texts are changed to "Single Period Decodes" and + "Average Decodes" only if averaging is enabled. + + - Some improvements to the Hamlib Transceiver code. Behavior is now + more stable when Rig Split has been selected. + + - Prevented redundant network communication between WSJT-X and DX Lab + Suite Commander. + + - Download of the LotW file now works without OpenSSL libraries. + + - Made the spot counter work for WSPR. + + - Prevented insertion of an individual contest name when in Fox mode. + + - WAE entities are now assigned to the correct DXCC when "Include + extra WAE entities" is not selected. + + - Added a utility program 'cablog' which can be used to convert the + wsjtx.log file to Cabrillo format for the ARRL EME contest. + + - Minor improvements to the Active Stations window. + + - The Rx/Tx frequency for Echo mode has been fixed at 1500 Hz. + + - Some corrections and updates to the INSTALL instructions for Linux. + + - Updated CTY.DAT file. + Release: WSJT-X 2.7.0-rc2 July 7, 2023 ------------------------- diff --git a/Release_Notes.txt b/Release_Notes.txt index 6ea9d3a73..a94711c77 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -11,8 +11,8 @@ Copyright 2001 - 2024 by Joe Taylor, K1JT, and the WSJT Development Team - Release: WSJT-X 2.7.0-rc3 - January 1, 2024 + Release: WSJT-X 2.7.0-rc3 + January 1, 2024 ------------------------- WSJT-X 2.7.0 Release Candidate 3 brings some new features, as well as @@ -68,24 +68,7 @@ numerous detail improvements and bug fixes, such as: - Updated CTY.DAT file. - -/////// NOT YET USED TEXT MODULES - -QMAP: -- Use AlignCenter for Max Age and Max N controls in Active Stations window. -- Must define 'offset' as a Fortran integer. Increase NJUNK by 1. -- Protect against wacky settings of nfa, nfb, in Q65 mode. - -WSJT-X: -- ldpcsim174_91: Add the option to simulate the (174,91) code with noncoherent 8FSK on AWGN and block Rayleigh channels. -- protect against invalid argument in pctile(). -- Change the label texts to "Single Period Decodes" and "Average Decodes" only if averaging is enabled. - -//////// - - - - Release: WSJT-X 2.7.0-rc2 + Release: WSJT-X 2.7.0-rc2 July 7, 2023 ------------------------- diff --git a/lib/decode_msk144.f90 b/lib/decode_msk144.f90 new file mode 100644 index 000000000..17110cf47 --- /dev/null +++ b/lib/decode_msk144.f90 @@ -0,0 +1,57 @@ +subroutine decode_msk144(audio_samples, params, data_dir) + include 'jt9com.f90' + + ! constants + integer, parameter :: SAMPLING_RATE = 12000 + integer, parameter :: BLOCK_SIZE = 7168 + integer, parameter :: STEP_SIZE = BLOCK_SIZE / 2 + integer, parameter :: CALL_LENGTH = 12 + + ! aguments + integer*2 audio_samples(NMAX) + type(params_block) :: params + character(len = 500) :: data_dir + + ! parameters of mskrtd + integer*2 :: buffer(BLOCK_SIZE) + real :: tsec + logical :: bshmsg = .false. ! enables shorthand messages + logical :: btrain = .false. ! turns on training in MSK144 mode + real*8 :: pcoeffs(5) = (/ 0.0, 0.0, 0.0, 0.0, 0.0 /); ! phase equalization + logical :: bswl = .false. + character(len = 80) :: line + character(len = CALL_LENGTH) :: mycall + character(len = CALL_LENGTH) :: hiscall + + ! local variables + integer :: sample_count + integer :: position + integer :: message_count = 0 + + + ! decode in 0.3s blocks + sample_count = params%ntr * SAMPLING_RATE + mycall = transfer(params%mycall, mycall) ! string to char[] + hiscall = transfer(params%hiscall, hiscall) + + do position = 1, sample_count - BLOCK_SIZE + 1, STEP_SIZE + buffer = audio_samples(position : position + BLOCK_SIZE - 1) + tsec = position / REAL(SAMPLING_RATE) + + call mskrtd(buffer, params%nutc, tsec, params%ntol, params%nfqso, params%ndepth, & + mycall, hiscall, bshmsg, btrain, pcoeffs, bswl, data_dir, line) + + if (line(1:1) .ne. char(0)) then + line = line(1:index(line, char(0))-1) + write(*, 1001) line + 1001 format(a80) + message_count = message_count + 1; + end if + end do + + if (.not. params%ndiskdat) then + write(*, 1002) 0, message_count, 0 + 1002 format('', 2i4, i9) + end if + +end subroutine decode_msk144 \ No newline at end of file diff --git a/lib/jt9.f90 b/lib/jt9.f90 index 3621a0a9f..d284f6dd2 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -27,7 +27,7 @@ program jt9 logical :: read_files = .true., tx9 = .false., display_help = .false., & bLowSidelobes = .false., nexp_decode_set = .false., & have_ntol = .false. - type (option) :: long_options(32) = [ & + type (option) :: long_options(33) = [ & option ('help', .false., 'h', 'Display this help message', ''), & option ('shmem',.true.,'s','Use shared memory for sample data','KEY'), & option ('tr-period', .true., 'p', 'Tx/Rx period, default SECONDS=60', & @@ -64,6 +64,7 @@ program jt9 option ('ft8', .false., '8', 'FT8 mode', ''), & option ('jt9', .false., '9', 'JT9 mode', ''), & option ('qra64', .false., 'q', 'QRA64 mode', ''), & + option ('msk144', .false., 'k', 'MSK144 mode', ''), & option ('QSOprog', .true., 'Q', 'QSO progress (0-5), default PROGRESS=1',& 'QSOprogress'), & option ('sub-mode', .true., 'b', 'Sub mode, default SUBMODE=A', 'A'), & @@ -91,7 +92,7 @@ program jt9 TRperiod=60.d0 do - call getopt('hs:e:a:b:r:m:p:d:f:F:w:t:9876543WYqTL:S:H:c:G:x:g:X:Q:', & + call getopt('hs:e:a:b:r:m:p:d:f:F:w:t:9876543WYqkTL:S:H:c:G:x:g:X:Q:', & long_options,c,optarg,arglen,stat,offset,remain,.true.) if (stat .ne. 0) then exit @@ -129,7 +130,9 @@ program jt9 read (optarg(:arglen), *) fhigh case ('q') mode = 164 - case ('Q') + case ('k') + mode = 144 + case ('Q') read (optarg(:arglen), *) nQSOProg case ('3') mode = 66 @@ -352,7 +355,12 @@ program jt9 call multimode_decoder(shared_data%ss,id2a, & shared_data%params,nfsample) cycle + + ! MSK144 + else if (mode .eq. 144) then + call decode_msk144(shared_data%id2, shared_data%params, data_dir) endif + ! Normal decoding pass call multimode_decoder(shared_data%ss,shared_data%id2, & shared_data%params,nfsample) diff --git a/lib/jt9a.f90 b/lib/jt9a.f90 index f9399f4a0..546ef9246 100644 --- a/lib/jt9a.f90 +++ b/lib/jt9a.f90 @@ -70,8 +70,15 @@ subroutine jt9a() call multimode_decoder(shared_data%ss,id2a,local_params,12000) local_params%nzhsym=50 endif -! Normal decoding pass - call multimode_decoder(shared_data%ss,shared_data%id2,local_params,12000) + + if(local_params%nmode .eq. 144) then + ! MSK144 + call decode_msk144(shared_data%id2, shared_data%params, data_dir) + else + ! Normal decoding pass + call multimode_decoder(shared_data%ss,shared_data%id2,local_params,12000) + endif + call timer('decoder ',1) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 429bf2a92..81772df38 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -10176,10 +10176,7 @@ list1Done: if(list2.size()==m_Nslots) { break; } - - if(m_foxQSO.count()>=5*3 /* could have 5 slots * 3 states ([0-2],4,5) */) { - break; - } + } list2Done: