Add WW_DIGI to the special activities section. Make necessary changes to

the decoders. Also, an experimental change to the FT4 decoder to base
AP decoding passes on 4-symbol block detection instead of single symbol
detection. This provides about 1 dB improvement on the AWGN channel.
Sensitivity changes on other channels are TBD.
This commit is contained in:
Steven Franke 2020-01-24 11:26:36 -06:00
parent 9aaffb9252
commit 70b84478f0
11 changed files with 108 additions and 88 deletions

View File

@ -1084,6 +1084,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
ui_->special_op_activity_button_group->setId (ui_->rbEU_VHF_Contest, static_cast<int> (SpecialOperatingActivity::EU_VHF)); ui_->special_op_activity_button_group->setId (ui_->rbEU_VHF_Contest, static_cast<int> (SpecialOperatingActivity::EU_VHF));
ui_->special_op_activity_button_group->setId (ui_->rbField_Day, static_cast<int> (SpecialOperatingActivity::FIELD_DAY)); ui_->special_op_activity_button_group->setId (ui_->rbField_Day, static_cast<int> (SpecialOperatingActivity::FIELD_DAY));
ui_->special_op_activity_button_group->setId (ui_->rbRTTY_Roundup, static_cast<int> (SpecialOperatingActivity::RTTY)); ui_->special_op_activity_button_group->setId (ui_->rbRTTY_Roundup, static_cast<int> (SpecialOperatingActivity::RTTY));
ui_->special_op_activity_button_group->setId (ui_->rbWW_DIGI, static_cast<int> (SpecialOperatingActivity::WW_DIGI));
ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast<int> (SpecialOperatingActivity::FOX)); ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast<int> (SpecialOperatingActivity::FOX));
ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast<int> (SpecialOperatingActivity::HOUND)); ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast<int> (SpecialOperatingActivity::HOUND));

View File

@ -180,7 +180,7 @@ public:
bool highlight_only_fields () const; bool highlight_only_fields () const;
bool include_WAE_entities () const; bool include_WAE_entities () const;
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, FOX, HOUND}; enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND};
SpecialOperatingActivity special_op_id () const; SpecialOperatingActivity special_op_id () const;
struct CalibrationParams struct CalibrationParams

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>554</width> <width>670</width>
<height>563</height> <height>617</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -559,7 +559,7 @@ quiet period when decoding is done.</string>
<property name="editable"> <property name="editable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="currentText"> <property name="currentText" stdset="0">
<string/> <string/>
</property> </property>
<property name="insertPolicy"> <property name="insertPolicy">
@ -1021,7 +1021,7 @@ other hardware interface for PTT.</string>
<property name="editable"> <property name="editable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="currentText"> <property name="currentText" stdset="0">
<string/> <string/>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
@ -2261,9 +2261,6 @@ Right click for insert and delete options.</string>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.&lt;/p&gt;&lt;p&gt;Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.&lt;/p&gt;&lt;p&gt;Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set> <set>QAbstractItemView::NoEditTriggers</set>
</property> </property>
@ -2572,6 +2569,19 @@ Right click for insert and delete options.</string>
</attribute> </attribute>
</widget> </widget>
</item> </item>
<item row="0" column="1" rowspan="3">
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="3"> <item row="2" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1"> <layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item> <item>
@ -2635,19 +2645,6 @@ Right click for insert and delete options.</string>
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="1" rowspan="3">
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="3"> <item row="1" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1"> <layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
<item> <item>
@ -2711,6 +2708,25 @@ Right click for insert and delete options.</string>
</item> </item>
</layout> </layout>
</item> </item>
<item row="3" column="0">
<widget class="QRadioButton" name="rbWW_DIGI">
<property name="minimumSize">
<size>
<width>0</width>
<height>18</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;World-Wide Digi-mode contest&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>WW Digi Contest</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -3093,12 +3109,12 @@ Right click for insert and delete options.</string>
</connections> </connections>
<buttongroups> <buttongroups>
<buttongroup name="split_mode_button_group"/> <buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/> <buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="special_op_activity_button_group"/> <buttongroup name="special_op_activity_button_group"/>
<buttongroup name="CAT_handshake_button_group"/> <buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="PTT_method_button_group"/> <buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/> <buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
</buttongroups> </buttongroups>
</ui> </ui>

View File

@ -65,7 +65,6 @@ extern struct dec_data {
char mygrid[6]; char mygrid[6];
char hiscall[12]; char hiscall[12];
char hisgrid[6]; char hisgrid[6];
char cqstr[4];
} params; } params;
} dec_data; } dec_data;

View File

@ -40,7 +40,6 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
character(len=20) :: datetime character(len=20) :: datetime
character(len=12) :: mycall, hiscall character(len=12) :: mycall, hiscall
character(len=6) :: mygrid, hisgrid character(len=6) :: mygrid, hisgrid
character(len=4) :: cqstr
save save
type(counting_jt4_decoder) :: my_jt4 type(counting_jt4_decoder) :: my_jt4
type(counting_jt65_decoder) :: my_jt65 type(counting_jt65_decoder) :: my_jt65
@ -54,7 +53,6 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
hiscall=transfer(params%hiscall,hiscall) hiscall=transfer(params%hiscall,hiscall)
mygrid=transfer(params%mygrid,mygrid) mygrid=transfer(params%mygrid,mygrid)
hisgrid=transfer(params%hisgrid,hisgrid) hisgrid=transfer(params%hisgrid,hisgrid)
cqstr=transfer(params%cqstr,cqstr)
! initialize decode counts ! initialize decode counts
my_jt4%decoded = 0 my_jt4%decoded = 0
@ -88,7 +86,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
if(params%nmode.eq.8) then if(params%nmode.eq.8) then
! We're in FT8 mode ! We're in FT8 mode
if(ncontest.eq.5) then if(ncontest.eq.6) then
! Fox mode: initialize and open houndcallers.txt ! Fox mode: initialize and open houndcallers.txt
inquire(file=trim(temp_dir)//'/houndcallers.txt',exist=ex) inquire(file=trim(temp_dir)//'/houndcallers.txt',exist=ex)
if(.not.ex) then if(.not.ex) then
@ -117,7 +115,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
endif endif
j=0 j=0
if(ncontest.eq.5) then if(ncontest.eq.6) then
! Fox mode: save decoded Hound calls for possible selection by FoxOp ! Fox mode: save decoded Hound calls for possible selection by FoxOp
rewind 19 rewind 19
if(nfox.eq.0) then if(nfox.eq.0) then
@ -155,7 +153,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
call timer('decft4 ',0) call timer('decft4 ',0)
call my_ft4%decode(ft4_decoded,id2,params%nQSOProgress,params%nfqso, & call my_ft4%decode(ft4_decoded,id2,params%nQSOProgress,params%nfqso, &
params%nutc,params%nfa,params%nfb,params%ndepth, & params%nutc,params%nfa,params%nfb,params%ndepth, &
logical(params%lapcqonly),ncontest,cqstr,mycall,hiscall) logical(params%lapcqonly),ncontest,mycall,hiscall)
call timer('decft4 ',1) call timer('decft4 ',1)
go to 800 go to 800
endif endif
@ -282,7 +280,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
1010 format('<DecodeFinished>',2i4) 1010 format('<DecodeFinished>',2i4)
call flush(6) call flush(6)
close(13) close(13)
if(ncontest.eq.5) close(19) if(ncontest.eq.6) close(19)
if(params%nmode.eq.4 .or. params%nmode.eq.65) close(14) if(params%nmode.eq.4 .or. params%nmode.eq.65) close(14)
return return
@ -536,7 +534,7 @@ contains
write(13,1002) params%nutc,nint(sync),snr,dt,freq,0,decoded0 write(13,1002) params%nutc,nint(sync),snr,dt,freq,0,decoded0
1002 format(i6.6,i4,i5,f6.1,f8.0,i4,3x,a37,' FT8') 1002 format(i6.6,i4,i5,f6.1,f8.0,i4,3x,a37,' FT8')
if(ncontest.eq.5) then if(ncontest.eq.6) then
i1=index(decoded0,' ') i1=index(decoded0,' ')
i2=i1 + index(decoded0(i1+1:),' ') i2=i1 + index(decoded0(i1+1:),' ')
i3=i2 + index(decoded0(i2+1:),' ') i3=i2 + index(decoded0(i2+1:),' ')

View File

@ -24,7 +24,7 @@ module ft4_decode
contains contains
subroutine decode(this,callback,iwave,nQSOProgress,nfqso, & subroutine decode(this,callback,iwave,nQSOProgress,nfqso, &
nutc,nfa,nfb,ndepth,lapcqonly,ncontest,cqstr,mycall,hiscall) nutc,nfa,nfb,ndepth,lapcqonly,ncontest,mycall,hiscall)
use timer_module, only: timer use timer_module, only: timer
use packjt77 use packjt77
include 'ft4/ft4_params.f90' include 'ft4/ft4_params.f90'
@ -39,7 +39,6 @@ contains
character*12 mycall,hiscall character*12 mycall,hiscall
character*12 mycall0,hiscall0 character*12 mycall0,hiscall0
character*6 hhmmss character*6 hhmmss
character*4 cqstr,cqstr0
complex cd2(0:NDMAX-1) !Complex waveform complex cd2(0:NDMAX-1) !Complex waveform
complex cb(0:NDMAX-1) complex cb(0:NDMAX-1)
@ -61,7 +60,7 @@ contains
integer i4tone(103) integer i4tone(103)
integer nappasses(0:5) ! # of decoding passes for QSO States 0-5 integer nappasses(0:5) ! # of decoding passes for QSO States 0-5
integer naptypes(0:5,4) ! nQSOProgress, decoding pass integer naptypes(0:5,4) ! nQSOProgress, decoding pass
integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29),mcqscc(29) integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29),mcqww(29)
integer mrrr(19),m73(19),mrr73(19) integer mrrr(19),m73(19),mrr73(19)
logical nohiscall,unpk77_success logical nohiscall,unpk77_success
@ -75,7 +74,7 @@ contains
data mcqru/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0/ data mcqru/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0/
data mcqfd/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0/ data mcqfd/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0/
data mcqtest/0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0/ data mcqtest/0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0/
data mcqscc/0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,0,1,1,0,1,0,0/ data mcqww/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,0/
data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/
data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/ data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/
data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/ data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/
@ -83,7 +82,7 @@ contains
1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, &
0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/
save fs,dt,tt,txt,twopi,h,first,apbits,nappasses,naptypes, & save fs,dt,tt,txt,twopi,h,first,apbits,nappasses,naptypes, &
mycall0,hiscall0,cqstr0,ctwk2 mycall0,hiscall0,ctwk2
this%callback => callback this%callback => callback
hhmmss=cdatetime0(8:13) hhmmss=cdatetime0(8:13)
@ -107,7 +106,7 @@ contains
mcqru=2*mod(mcqru+rvec(1:29),2)-1 mcqru=2*mod(mcqru+rvec(1:29),2)-1
mcqfd=2*mod(mcqfd+rvec(1:29),2)-1 mcqfd=2*mod(mcqfd+rvec(1:29),2)-1
mcqtest=2*mod(mcqtest+rvec(1:29),2)-1 mcqtest=2*mod(mcqtest+rvec(1:29),2)-1
mcqscc=2*mod(mcqscc+rvec(1:29),2)-1 mcqww=2*mod(mcqww+rvec(1:29),2)-1
mrrr=2*mod(mrrr+rvec(59:77),2)-1 mrrr=2*mod(mrrr+rvec(59:77),2)-1
m73=2*mod(m73+rvec(59:77),2)-1 m73=2*mod(m73+rvec(59:77),2)-1
mrr73=2*mod(mrr73+rvec(59:77),2)-1 mrr73=2*mod(mrr73+rvec(59:77),2)-1
@ -136,7 +135,6 @@ contains
mycall0='' mycall0=''
hiscall0='' hiscall0=''
cqstr0=''
first=.false. first=.false.
endif endif
@ -320,7 +318,7 @@ contains
npasses=3+nappasses(nQSOProgress) npasses=3+nappasses(nQSOProgress)
if(lapcqonly) npasses=4 if(lapcqonly) npasses=4
if(ndepth.eq.1) npasses=3 if(ndepth.eq.1) npasses=3
if(ncontest.ge.5) npasses=3 ! Don't support Fox and Hound if(ncontest.ge.6) npasses=3 ! Don't support Fox and Hound
do ipass=1,npasses do ipass=1,npasses
if(ipass.eq.1) llr=llra if(ipass.eq.1) llr=llra
if(ipass.eq.2) llr=llrb if(ipass.eq.2) llr=llrb
@ -331,7 +329,7 @@ contains
endif endif
if(ipass .gt. 3) then if(ipass .gt. 3) then
llrd=llra llrd=llrc
iaptype=naptypes(nQSOProgress,ipass-3) iaptype=naptypes(nQSOProgress,ipass-3)
if(lapcqonly) iaptype=1 if(lapcqonly) iaptype=1
@ -340,29 +338,30 @@ contains
! 2 : EU_VHF ! 2 : EU_VHF
! 3 : FIELD DAY ! 3 : FIELD DAY
! 4 : RTTY ! 4 : RTTY
! 5 : FOX ! 5 : WW_DIGI
! 6 : HOUND ! 6 : FOX
! 7 : HOUND
! !
! Conditions that cause us to bail out of AP decoding ! Conditions that cause us to bail out of AP decoding
napwid=80 napwid=80
if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid) ) cycle if(ncontest.le.5 .and. iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid) ) cycle
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall
if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ SCC if(iaptype.eq.1) then ! CQ or CQ TEST or CQ FD or CQ RU or CQ WW
apmask=0 apmask=0
apmask(1:29)=1 apmask(1:29)=1
if( ncontest.eq.0 ) llrd(1:29)=apmag*mcq(1:29) if( ncontest.eq.0 ) llrd(1:29)=apmag*mcq(1:29)
if( ncontest.eq.1 ) llrd(1:29)=apmag*mcqtest(1:29) if( ncontest.eq.1 ) llrd(1:29)=apmag*mcqtest(1:29)
if( ncontest.eq.2 ) llrd(1:29)=apmag*mcqtest(1:29) if( ncontest.eq.2 ) llrd(1:29)=apmag*mcqtest(1:29)
if( ncontest.eq.3 ) llrd(1:29)=apmag*mcqfd(1:29) if( ncontest.eq.3 ) llrd(1:29)=apmag*mcqfd(1:29)
if( ncontest.eq.4 .and. cqstr(1:2)=='RU') llrd(1:29)=apmag*mcqru(1:29) if( ncontest.eq.4 ) llrd(1:29)=apmag*mcqru(1:29)
if( ncontest.eq.4 .and. cqstr(1:3)=='SCC') llrd(1:29)=apmag*mcqscc(1:29) if( ncontest.eq.5 ) llrd(1:29)=apmag*mcqww(1:29)
endif endif
if(iaptype.eq.2) then ! MyCall,???,??? if(iaptype.eq.2) then ! MyCall,???,???
apmask=0 apmask=0
if(ncontest.eq.0.or.ncontest.eq.1) then if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.5) then
apmask(1:29)=1 apmask(1:29)=1
llrd(1:29)=apmag*apbits(1:29) llrd(1:29)=apmag*apbits(1:29)
else if(ncontest.eq.2) then else if(ncontest.eq.2) then
@ -379,14 +378,14 @@ contains
if(iaptype.eq.3) then ! MyCall,DxCall,??? if(iaptype.eq.3) then ! MyCall,DxCall,???
apmask=0 apmask=0
if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2) then if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2.or.ncontest.eq.5) then
apmask(1:58)=1 apmask(1:58)=1
llrd(1:58)=apmag*apbits(1:58) llrd(1:58)=apmag*apbits(1:58)
else if(ncontest.eq.3) then ! Field Day else if(ncontest.eq.3) then ! Field Day
apmask(1:56)=1 apmask(1:56)=1
llrd(1:28)=apmag*apbits(1:28) llrd(1:28)=apmag*apbits(1:28)
llrd(29:56)=apmag*aphis_fd(1:28) llrd(29:56)=apmag*aphis_fd(1:28)
else if(ncontest.eq.4) then ! RTTY RU else if(ncontest.eq.4) then
apmask(2:57)=1 apmask(2:57)=1
llrd(2:29)=apmag*apmy_ru(1:28) llrd(2:29)=apmag*apmy_ru(1:28)
llrd(30:57)=apmag*apbits(30:57) llrd(30:57)=apmag*apbits(30:57)
@ -395,7 +394,7 @@ contains
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then
apmask=0 apmask=0
if(ncontest.le.4) then if(ncontest.le.5) then
apmask(1:77)=1 ! mycall, hiscall, RRR|73|RR73 apmask(1:77)=1 ! mycall, hiscall, RRR|73|RR73
if(iaptype.eq.6) llrd(1:77)=apmag*apbits(1:77) if(iaptype.eq.6) llrd(1:77)=apmag*apbits(1:77)
endif endif
@ -452,11 +451,11 @@ contains
call this%callback(smax,nsnr,xdt,f1,message,iaptype,qual) call this%callback(smax,nsnr,xdt,f1,message,iaptype,qual)
exit exit
endif endif
enddo !Sequence estimation enddo !Sequence estimation
if(nharderror.ge.0) exit if(nharderror.ge.0) exit
enddo !3 DT segments enddo !3 DT segments
enddo !Candidate list enddo !Candidate list
enddo !Subtraction loop enddo !Subtraction loop
return return
end subroutine decode end subroutine decode

View File

@ -18,7 +18,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
real dd0(15*12000) real dd0(15*12000)
integer*1 message77(77),apmask(174),cw(174) integer*1 message77(77),apmask(174),cw(174)
integer apsym(58) integer apsym(58)
integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29) integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29),mcqww(29)
integer mrrr(19),m73(19),mrr73(19) integer mrrr(19),m73(19),mrr73(19)
integer itone(NN) integer itone(NN)
integer icos7(0:6),ip(1) integer icos7(0:6),ip(1)
@ -37,6 +37,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
data mcqru/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0/ data mcqru/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0/
data mcqfd/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0/ data mcqfd/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0/
data mcqtest/0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0/ data mcqtest/0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0/
data mcqww/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,0/
data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/
data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/ data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/
data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/ data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/
@ -50,6 +51,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
mcqfd=2*mcqfd-1 mcqfd=2*mcqfd-1
mcqru=2*mcqru-1 mcqru=2*mcqru-1
mcqtest=2*mcqtest-1 mcqtest=2*mcqtest-1
mcqww=2*mcqww-1
mrrr=2*mrrr-1 mrrr=2*mrrr-1
m73=2*m73-1 m73=2*m73-1
mrr73=2*mrr73-1 mrr73=2*mrr73-1
@ -226,7 +228,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
! 6 ap pass 3 ! 6 ap pass 3
! 7 ap pass 4 ! 7 ap pass 4
if(lapon.or.ncontest.eq.6) then !Hounds always use AP if(lapon.or.ncontest.eq.7) then !Hounds always use AP
if(.not.lapcqonly) then if(.not.lapcqonly) then
npasses=3+nappasses(nQSOProgress) npasses=3+nappasses(nQSOProgress)
else else
@ -258,13 +260,14 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
! 2 : EU_VHF ! 2 : EU_VHF
! 3 : FIELD DAY ! 3 : FIELD DAY
! 4 : RTTY ! 4 : RTTY
! 5 : FOX ! 5 : WW_DIGI
! 6 : HOUND ! 6 : FOX
! 7 : HOUND
! !
! Conditions that cause us to bail out of AP decoding ! Conditions that cause us to bail out of AP decoding
if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid .and. abs(f1-nftx).gt.napwid) ) cycle if(ncontest.le.5 .and. iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid .and. abs(f1-nftx).gt.napwid) ) cycle
if(ncontest.eq.5) cycle ! No AP for Foxes if(ncontest.eq.6) cycle ! No AP for Foxes
if(ncontest.eq.6.and.f1.gt.950.0) cycle ! Hounds use AP only for signals below 950 Hz if(ncontest.eq.7.and.f1.gt.950.0) cycle ! Hounds use AP only for signals below 950 Hz
if(iaptype.ge.2 .and. apsym(1).gt.1) cycle ! No, or nonstandard, mycall if(iaptype.ge.2 .and. apsym(1).gt.1) cycle ! No, or nonstandard, mycall
if(iaptype.ge.3 .and. apsym(30).gt.1) cycle ! No, or nonstandard, dxcall if(iaptype.ge.3 .and. apsym(30).gt.1) cycle ! No, or nonstandard, dxcall
@ -276,7 +279,8 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
if(ncontest.eq.2) llrd(1:29)=apmag*mcqtest(1:29) if(ncontest.eq.2) llrd(1:29)=apmag*mcqtest(1:29)
if(ncontest.eq.3) llrd(1:29)=apmag*mcqfd(1:29) if(ncontest.eq.3) llrd(1:29)=apmag*mcqfd(1:29)
if(ncontest.eq.4) llrd(1:29)=apmag*mcqru(1:29) if(ncontest.eq.4) llrd(1:29)=apmag*mcqru(1:29)
if(ncontest.eq.6) llrd(1:29)=apmag*mcq(1:29) if(ncontest.eq.5) llrd(1:29)=apmag*mcqww(1:29)
if(ncontest.eq.7) llrd(1:29)=apmag*mcq(1:29)
apmask(75:77)=1 apmask(75:77)=1
llrd(75:76)=apmag*(-1) llrd(75:76)=apmag*(-1)
llrd(77)=apmag*(+1) llrd(77)=apmag*(+1)
@ -284,7 +288,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
if(iaptype.eq.2) then ! MyCall,???,??? if(iaptype.eq.2) then ! MyCall,???,???
apmask=0 apmask=0
if(ncontest.eq.0.or.ncontest.eq.1) then if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.5) then
apmask(1:29)=1 apmask(1:29)=1
llrd(1:29)=apmag*apsym(1:29) llrd(1:29)=apmag*apsym(1:29)
apmask(75:77)=1 apmask(75:77)=1
@ -322,7 +326,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
if(iaptype.eq.3) then ! MyCall,DxCall,??? if(iaptype.eq.3) then ! MyCall,DxCall,???
apmask=0 apmask=0
if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2.or.ncontest.eq.6) then if(ncontest.eq.0.or.ncontest.eq.1.or.ncontest.eq.2.or.ncontest.eq.5.or.ncontest.eq.7) then
apmask(1:58)=1 apmask(1:58)=1
llrd(1:58)=apmag*apsym llrd(1:58)=apmag*apsym
apmask(75:77)=1 apmask(75:77)=1
@ -335,7 +339,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
apmask(72:74)=1 apmask(72:74)=1
apmask(75:77)=1 apmask(75:77)=1
llrd(75:77)=apmag*(-1) llrd(75:77)=apmag*(-1)
else if(ncontest.eq.4) then ! RTTY RU else if(ncontest.eq.4) then
apmask(2:57)=1 apmask(2:57)=1
llrd(2:29)=apmag*apsym(1:28) llrd(2:29)=apmag*apsym(1:28)
llrd(30:57)=apmag*apsym(30:57) llrd(30:57)=apmag*apsym(30:57)
@ -345,16 +349,16 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
endif endif
endif endif
if(iaptype.eq.5.and.ncontest.eq.6) cycle !Hound if(iaptype.eq.5.and.ncontest.eq.7) cycle !Hound
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype.eq.6) then
apmask=0 apmask=0
if(ncontest.le.4 .or. (ncontest.eq.6.and.iaptype.eq.6)) then if(ncontest.le.5 .or. (ncontest.eq.7.and.iaptype.eq.6)) then
apmask(1:77)=1 ! mycall, hiscall, RRR|73|RR73 apmask(1:77)=1 ! mycall, hiscall, RRR|73|RR73
llrd(1:58)=apmag*apsym llrd(1:58)=apmag*apsym
if(iaptype.eq.4) llrd(59:77)=apmag*mrrr if(iaptype.eq.4) llrd(59:77)=apmag*mrrr
if(iaptype.eq.5) llrd(59:77)=apmag*m73 if(iaptype.eq.5) llrd(59:77)=apmag*m73
if(iaptype.eq.6) llrd(59:77)=apmag*mrr73 if(iaptype.eq.6) llrd(59:77)=apmag*mrr73
else if(ncontest.eq.6.and.iaptype.eq.4) then ! Hound listens for MyCall RR73;... else if(ncontest.eq.7.and.iaptype.eq.4) then ! Hound listens for MyCall RR73;...
apmask(1:28)=1 apmask(1:28)=1
llrd(1:28)=apmag*apsym(1:28) llrd(1:28)=apmag*apsym(1:28)
apmask(72:77)=1 apmask(72:77)=1

View File

@ -8,7 +8,7 @@ subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,ncontest,bmsk144, &
! ntrpdepth TR period and 1000*ndepth ! ntrpdepth TR period and 1000*ndepth
! nrxfreq Rx audio center frequency ! nrxfreq Rx audio center frequency
! ntol Decoding range is +/- ntol ! ntol Decoding range is +/- ntol
! ncontest Contest type (0=NONE 1=NA_VHF 2=EU_VHF 3=FIELD_DAY 4=RTTY) ! ncontest Contest type (0=NONE 1=NA_VHF 2=EU_VHF 3=FIELD_DAY 4=RTTY 5=WW_DIGI)
! bmsk144 Boolean, true if in MSK144 mode ! bmsk144 Boolean, true if in MSK144 mode
! btrain Boolean, turns on training in MSK144 mode ! btrain Boolean, turns on training in MSK144 mode
! ingain Relative gain for spectra ! ingain Relative gain for spectra

View File

@ -46,7 +46,6 @@
character(kind=c_char) :: mygrid(6) character(kind=c_char) :: mygrid(6)
character(kind=c_char) :: hiscall(12) character(kind=c_char) :: hiscall(12)
character(kind=c_char) :: hisgrid(6) character(kind=c_char) :: hisgrid(6)
character(kind=c_char) :: cqstr(4)
end type params_block end type params_block
type, bind(C) :: dec_data type, bind(C) :: dec_data

View File

@ -137,7 +137,7 @@ void LogQSO::accept()
using SpOp = Configuration::SpecialOperatingActivity; using SpOp = Configuration::SpecialOperatingActivity;
auto special_op = m_config->special_op_id (); auto special_op = m_config->special_op_id ();
if (special_op == SpOp::NA_VHF) { if (special_op == SpOp::NA_VHF or special_op == SpOp::WW_DIGI) {
if(xrcvd!="" and hisGrid!=xrcvd) hisGrid=xrcvd; if(xrcvd!="" and hisGrid!=xrcvd) hisGrid=xrcvd;
} }

View File

@ -1247,7 +1247,7 @@ void MainWindow::checkMSK144ContestType()
if(m_mode=="MSK144" && SpecOp::EU_VHF < m_config.special_op_id()) if(m_mode=="MSK144" && SpecOp::EU_VHF < m_config.special_op_id())
{ {
MessageBox::warning_message (this, tr ("Improper mode"), MessageBox::warning_message (this, tr ("Improper mode"),
"Mode will be changed to FT8. MSK144 not available if Fox, Hound, Field Day, or RTTY contest is selected."); "Mode will be changed to FT8. MSK144 not available if Field Day, WW Digi, RTTY or Fox/Hound is selected.");
on_actionFT8_triggered(); on_actionFT8_triggered();
} }
} }
@ -2933,7 +2933,6 @@ void MainWindow::decode() //decode()
QString hisGrid {ui->dxGridEntry->text ()}; QString hisGrid {ui->dxGridEntry->text ()};
memcpy(dec_data.params.hiscall,(hisCall + " ").toLatin1 ().constData (), sizeof dec_data.params.hiscall); memcpy(dec_data.params.hiscall,(hisCall + " ").toLatin1 ().constData (), sizeof dec_data.params.hiscall);
memcpy(dec_data.params.hisgrid,(hisGrid + " ").toLatin1 ().constData (), sizeof dec_data.params.hisgrid); memcpy(dec_data.params.hisgrid,(hisGrid + " ").toLatin1 ().constData (), sizeof dec_data.params.hisgrid);
memcpy(dec_data.params.cqstr,(m_cqStr + " ").toLatin1 ().constData (), sizeof dec_data.params.cqstr);
//newdat=1 ==> this is new data, must do the big FFT //newdat=1 ==> this is new data, must do the big FFT
//nagain=1 ==> decode only at fQSO +/- Tol //nagain=1 ==> decode only at fQSO +/- Tol
@ -3961,7 +3960,8 @@ void MainWindow::guiUpdate()
if(ui->txrb1->isEnabled() and if(ui->txrb1->isEnabled() and
(SpecOp::NA_VHF==m_config.special_op_id() or (SpecOp::NA_VHF==m_config.special_op_id() or
SpecOp::FIELD_DAY==m_config.special_op_id() or SpecOp::FIELD_DAY==m_config.special_op_id() or
SpecOp::RTTY==m_config.special_op_id()) ) { SpecOp::RTTY==m_config.special_op_id() or
SpecOp::WW_DIGI==m_config.special_op_id()) ) {
//We're in a contest-like mode other than EU_VHF: start QSO with Tx2. //We're in a contest-like mode other than EU_VHF: start QSO with Tx2.
ui->tx1->setEnabled(false); ui->tx1->setEnabled(false);
ui->txb1->setEnabled(false); ui->txb1->setEnabled(false);
@ -4576,7 +4576,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
or bEU_VHF_w2 or (m_QSOProgress==CALLING))) { or bEU_VHF_w2 or (m_QSOProgress==CALLING))) {
if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) { if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) {
if(SpecOp::NA_VHF==m_config.special_op_id()){ if(SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()){
gen_msg=setTxMsg(3); gen_msg=setTxMsg(3);
m_QSOProgress=ROGER_REPORT; m_QSOProgress=ROGER_REPORT;
} else { } else {
@ -4667,7 +4667,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
((r.toInt()>=-50 && r.toInt()<=49) or (r.toInt()>=529 && r.toInt()<=599))) { ((r.toInt()>=-50 && r.toInt()<=49) or (r.toInt()>=529 && r.toInt()<=599))) {
if(SpecOp::EU_VHF==m_config.special_op_id() or if(SpecOp::EU_VHF==m_config.special_op_id() or
SpecOp::FIELD_DAY==m_config.special_op_id() or SpecOp::FIELD_DAY==m_config.special_op_id() or
SpecOp::RTTY==m_config.special_op_id()) { SpecOp::RTTY==m_config.special_op_id()) {
gen_msg=setTxMsg(2); gen_msg=setTxMsg(2);
m_QSOProgress=REPORT; m_QSOProgress=REPORT;
} else { } else {
@ -4940,10 +4940,8 @@ void MainWindow::genCQMsg ()
if(SpecOp::NA_VHF == m_config.special_op_id()) m_cqStr="TEST"; if(SpecOp::NA_VHF == m_config.special_op_id()) m_cqStr="TEST";
if(SpecOp::EU_VHF == m_config.special_op_id()) m_cqStr="TEST"; if(SpecOp::EU_VHF == m_config.special_op_id()) m_cqStr="TEST";
if(SpecOp::FIELD_DAY == m_config.special_op_id()) m_cqStr="FD"; if(SpecOp::FIELD_DAY == m_config.special_op_id()) m_cqStr="FD";
if(SpecOp::RTTY == m_config.special_op_id()) { if(SpecOp::RTTY == m_config.special_op_id()) m_cqStr="RU";
if(m_config.RTTY_Exchange()!="SCC") m_cqStr="RU"; if(SpecOp::WW_DIGI == m_config.special_op_id()) m_cqStr="WW";
if(m_config.RTTY_Exchange()=="SCC") m_cqStr="SCC";
}
if( tlist.at(1)==m_config.my_callsign() ) { if( tlist.at(1)==m_config.my_callsign() ) {
t="CQ " + m_cqStr + " " + tlist.at(1) + " " + tlist.at(2); t="CQ " + m_cqStr + " " + tlist.at(1) + " " + tlist.at(2);
} else { } else {
@ -5044,8 +5042,9 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
msgtype(t0a + my_grid, ui->tx1); msgtype(t0a + my_grid, ui->tx1);
} }
if(SpecOp::NA_VHF==m_config.special_op_id()) sent=my_grid; if(SpecOp::NA_VHF==m_config.special_op_id()) sent=my_grid;
if(SpecOp::WW_DIGI==m_config.special_op_id()) sent=my_grid;
if(SpecOp::FIELD_DAY==m_config.special_op_id()) sent=m_config.Field_Day_Exchange(); if(SpecOp::FIELD_DAY==m_config.special_op_id()) sent=m_config.Field_Day_Exchange();
if(SpecOp::RTTY==m_config.special_op_id()) { if(SpecOp::RTTY==m_config.special_op_id()) {
sent=rst + m_config.RTTY_Exchange(); sent=rst + m_config.RTTY_Exchange();
QString t1=m_config.RTTY_Exchange(); QString t1=m_config.RTTY_Exchange();
if(t1=="DX" or t1=="#") { if(t1=="DX" or t1=="#") {
@ -5547,6 +5546,10 @@ void MainWindow::on_logQSOButton_clicked() //Log QSO button
m_rptSent=m_xSent.split(" ").at(0); m_rptSent=m_xSent.split(" ").at(0);
m_rptRcvd=m_xRcvd.split(" ").at(0); m_rptRcvd=m_xRcvd.split(" ").at(0);
break; break;
case SpecOp::WW_DIGI:
m_xSent=m_config.my_grid().left(4);
m_xRcvd=m_hisGrid;
break;
default: break; default: break;
} }
@ -5593,8 +5596,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call,
if(m_config.clear_DX () and SpecOp::HOUND != m_config.special_op_id()) clearDX (); if(m_config.clear_DX () and SpecOp::HOUND != m_config.special_op_id()) clearDX ();
m_dateTimeQSOOn = QDateTime {}; m_dateTimeQSOOn = QDateTime {};
auto special_op = m_config.special_op_id (); auto special_op = m_config.special_op_id ();
if (SpecOp::NONE < special_op && special_op < SpecOp::FOX && if (SpecOp::NONE < special_op && special_op < SpecOp::FOX) {
m_config.RTTY_Exchange()!="SCC") {
ui->sbSerialNumber->setValue(ui->sbSerialNumber->value() + 1); ui->sbSerialNumber->setValue(ui->sbSerialNumber->value() + 1);
} }
@ -5667,9 +5669,9 @@ void MainWindow::displayWidgets(qint64 n)
ui->pbBestSP->setVisible(m_mode=="FT4"); ui->pbBestSP->setVisible(m_mode=="FT4");
b=false; b=false;
if(m_mode=="FT4" or m_mode=="FT8") { if(m_mode=="FT4" or m_mode=="FT8") {
b=SpecOp::EU_VHF==m_config.special_op_id() or (SpecOp::RTTY==m_config.special_op_id() and b=SpecOp::EU_VHF==m_config.special_op_id() or
(m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="#" or ( SpecOp::RTTY==m_config.special_op_id() and
m_config.RTTY_Exchange()=="SCC")); (m_config.RTTY_Exchange()=="DX" or m_config.RTTY_Exchange()=="#") );
} }
if(m_mode=="MSK144") b=SpecOp::EU_VHF==m_config.special_op_id(); if(m_mode=="MSK144") b=SpecOp::EU_VHF==m_config.special_op_id();
ui->sbSerialNumber->setVisible(b); ui->sbSerialNumber->setVisible(b);
@ -5804,6 +5806,7 @@ void MainWindow::on_actionFT8_triggered()
if(SpecOp::EU_VHF==m_config.special_op_id()) t0+="EU VHF"; if(SpecOp::EU_VHF==m_config.special_op_id()) t0+="EU VHF";
if(SpecOp::FIELD_DAY==m_config.special_op_id()) t0+="Field Day"; if(SpecOp::FIELD_DAY==m_config.special_op_id()) t0+="Field Day";
if(SpecOp::RTTY==m_config.special_op_id()) t0+="RTTY"; if(SpecOp::RTTY==m_config.special_op_id()) t0+="RTTY";
if(SpecOp::WW_DIGI==m_config.special_op_id()) t0+="WW_DIGI";
if(t0=="") { if(t0=="") {
ui->labDXped->setVisible(false); ui->labDXped->setVisible(false);
} else { } else {
@ -8780,6 +8783,7 @@ void MainWindow::chkFT4()
if(SpecOp::EU_VHF==m_config.special_op_id()) t0+="EU VHF"; if(SpecOp::EU_VHF==m_config.special_op_id()) t0+="EU VHF";
if(SpecOp::FIELD_DAY==m_config.special_op_id()) t0+="Field Day"; if(SpecOp::FIELD_DAY==m_config.special_op_id()) t0+="Field Day";
if(SpecOp::RTTY==m_config.special_op_id()) t0+="RTTY"; if(SpecOp::RTTY==m_config.special_op_id()) t0+="RTTY";
if(SpecOp::WW_DIGI==m_config.special_op_id()) t0+="WW_DIGI";
if(t0=="") { if(t0=="") {
ui->labDXped->setVisible(false); ui->labDXped->setVisible(false);
} else { } else {