mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-25 13:48:42 -05:00
Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop
This commit is contained in:
commit
65dd843bfb
@ -107,6 +107,12 @@ OmniRigTransceiver::OmniRigTransceiver (std::unique_ptr<TransceiverBase> wrapped
|
||||
, send_update_signal_ {false}
|
||||
, reversed_ {false}
|
||||
{
|
||||
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
|
||||
}
|
||||
|
||||
OmniRigTransceiver::~OmniRigTransceiver ()
|
||||
{
|
||||
CoUninitialize ();
|
||||
}
|
||||
|
||||
// returns false on time out
|
||||
@ -121,9 +127,8 @@ bool OmniRigTransceiver::await_notification_with_timeout (int timeout)
|
||||
int OmniRigTransceiver::do_start ()
|
||||
{
|
||||
TRACE_CAT ("OmniRigTransceiver", "starting");
|
||||
if (wrapped_) wrapped_->start (0);
|
||||
|
||||
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
|
||||
if (wrapped_) wrapped_->start (0);
|
||||
|
||||
omni_rig_.reset (new OmniRig::OmniRigX {this});
|
||||
if (omni_rig_->isNull ())
|
||||
@ -315,18 +320,19 @@ void OmniRigTransceiver::do_stop ()
|
||||
port_->clear ();
|
||||
port_.reset ();
|
||||
}
|
||||
if (omni_rig_)
|
||||
if (omni_rig_ && !omni_rig_->isNull ())
|
||||
{
|
||||
if (rig_)
|
||||
if (rig_ && !rig_->isNull ())
|
||||
{
|
||||
rig_->clear ();
|
||||
rig_.reset ();
|
||||
}
|
||||
omni_rig_->clear ();
|
||||
omni_rig_.reset ();
|
||||
CoUninitialize ();
|
||||
}
|
||||
|
||||
if (wrapped_) wrapped_->stop ();
|
||||
|
||||
TRACE_CAT ("OmniRigTransceiver", "stopped");
|
||||
}
|
||||
|
||||
@ -344,7 +350,6 @@ void OmniRigTransceiver::handle_visible_change ()
|
||||
|
||||
void OmniRigTransceiver::handle_rig_type_change (int rig_number)
|
||||
{
|
||||
if (!omni_rig_ || omni_rig_->isNull ()) return;
|
||||
TRACE_CAT ("OmniRigTransceiver", "rig type change: rig =" << rig_number);
|
||||
if (rig_number_ == rig_number)
|
||||
{
|
||||
@ -361,7 +366,6 @@ void OmniRigTransceiver::handle_rig_type_change (int rig_number)
|
||||
|
||||
void OmniRigTransceiver::handle_status_change (int rig_number)
|
||||
{
|
||||
if (!omni_rig_ || omni_rig_->isNull ()) return;
|
||||
TRACE_CAT ("OmniRigTransceiver", QString {"status change for rig %1"}.arg (rig_number).toLocal8Bit ());
|
||||
if (rig_number_ == rig_number)
|
||||
{
|
||||
@ -394,7 +398,6 @@ void OmniRigTransceiver::handle_status_change (int rig_number)
|
||||
|
||||
void OmniRigTransceiver::handle_params_change (int rig_number, int params)
|
||||
{
|
||||
if (!omni_rig_ || omni_rig_->isNull ()) return;
|
||||
TRACE_CAT ("OmniRigTransceiver", QString {"params change: params = 0x%1 for rig %2"}
|
||||
.arg (params, 8, 16, QChar ('0'))
|
||||
.arg (rig_number).toLocal8Bit ()
|
||||
@ -647,7 +650,6 @@ void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& co
|
||||
(void)command;
|
||||
(void)reply;
|
||||
|
||||
if (!omni_rig_ || omni_rig_->isNull ()) return;
|
||||
if (rig_number_ == rig_number)
|
||||
{
|
||||
if (!rig_ || rig_->isNull ()) return;
|
||||
@ -664,11 +666,14 @@ void OmniRigTransceiver::do_ptt (bool on)
|
||||
if (use_for_ptt_ && TransceiverFactory::PTT_method_CAT == ptt_type_)
|
||||
{
|
||||
TRACE_CAT ("OmniRigTransceiver", "set PTT");
|
||||
rig_->SetTx (on ? OmniRig::PM_TX : OmniRig::PM_RX);
|
||||
if (rig_ && !rig_->isNull ())
|
||||
{
|
||||
rig_->SetTx (on ? OmniRig::PM_TX : OmniRig::PM_RX);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (port_)
|
||||
if (port_ && !port_->isNull ())
|
||||
{
|
||||
if (TransceiverFactory::PTT_method_RTS == ptt_type_)
|
||||
{
|
||||
@ -695,6 +700,7 @@ void OmniRigTransceiver::do_ptt (bool on)
|
||||
void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
|
||||
{
|
||||
TRACE_CAT ("OmniRigTransceiver", f << state ());
|
||||
if (!rig_ || rig_->isNull ()) return;
|
||||
if (UNK != m)
|
||||
{
|
||||
do_mode (m);
|
||||
@ -723,6 +729,7 @@ void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
|
||||
void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore*/)
|
||||
{
|
||||
TRACE_CAT ("OmniRigTransceiver", tx << state ());
|
||||
if (!rig_ || rig_->isNull ()) return;
|
||||
bool split {tx != 0};
|
||||
if (split)
|
||||
{
|
||||
@ -787,6 +794,7 @@ void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore
|
||||
void OmniRigTransceiver::do_mode (MODE mode)
|
||||
{
|
||||
TRACE_CAT ("OmniRigTransceiver", mode << state ());
|
||||
if (!rig_ || rig_->isNull ()) return;
|
||||
// TODO: G4WJS OmniRig doesn't seem to have any capability of tracking/setting VFO B mode
|
||||
auto mapped = map_mode (mode);
|
||||
if (mapped & writable_params_)
|
||||
|
@ -32,6 +32,7 @@ public:
|
||||
|
||||
// takes ownership of wrapped Transceiver
|
||||
explicit OmniRigTransceiver (std::unique_ptr<TransceiverBase> wrapped, RigNumber, TransceiverFactory::PTTMethod ptt_type, QString const& ptt_port, QObject * parent = nullptr);
|
||||
~OmniRigTransceiver ();
|
||||
|
||||
int do_start () override;
|
||||
void do_stop () override;
|
||||
|
@ -59,8 +59,10 @@ be attempted in each state.
|
||||
|CALLING CQ | 1, 2
|
||||
|===========================================
|
||||
|
||||
Decoding with _a priori_ information behaves slightly differently
|
||||
in JT65. Some details are provided in Tables 3 and 4.
|
||||
Decoding with _a priori_ information behaves slightly differently in
|
||||
JT65. Some details are provided in Tables 3 and 4. Notations such as
|
||||
`a63`, use a second digit to indicate the number of Rx intervals
|
||||
averaged to obtain the decode.
|
||||
|
||||
[[JT65_AP_INFO_TABLE]]
|
||||
.JT65 AP information types
|
||||
|
@ -93,6 +93,7 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
|
||||
|
||||
call timer('dec65b ',0)
|
||||
qualbest=0.
|
||||
nftbest=0
|
||||
qual0=-1.e30
|
||||
minsmo=0
|
||||
maxsmo=0
|
||||
@ -126,7 +127,6 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
|
||||
call decode65b(s2,nflip,nadd,mode65,ntrials,naggressive,ndepth, &
|
||||
mycall,hiscall,hisgrid,nQSOProgress,ljt65apon,nqd,nft,qual, &
|
||||
nhist,decoded)
|
||||
|
||||
if(nft.eq.1) then
|
||||
nsmo=ismo
|
||||
param(9)=nsmo
|
||||
@ -138,18 +138,20 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
|
||||
qualbest=qual
|
||||
nnbest=nn
|
||||
nsmobest=ismo
|
||||
nftbest=nft
|
||||
endif
|
||||
endif
|
||||
if(qual.lt.qual0) exit
|
||||
qual0=qual
|
||||
enddo
|
||||
|
||||
if(nft.eq.2) then
|
||||
if(nftbest.eq.2) then
|
||||
decoded=decoded_best
|
||||
qual=qualbest
|
||||
nsmo=nsmobest
|
||||
param(9)=nsmo
|
||||
nn=nnbest
|
||||
nft=nftbest
|
||||
endif
|
||||
|
||||
call timer('dec65b ',1)
|
||||
|
@ -21,7 +21,7 @@ subroutine decode65b(s2,nflip,nadd,mode65,ntrials,naggressive,ndepth, &
|
||||
|
||||
call extract(s3,nadd,mode65,ntrials,naggressive,ndepth,nflip,mycall, &
|
||||
hiscall,hisgrid,nQSOProgress,ljt65apon,ncount, &
|
||||
nhist,decoded,ltext,nft,qual)
|
||||
nhist,decoded,ltext,nft,qual)
|
||||
|
||||
! Suppress "birdie messages" and other garbage decodes:
|
||||
if(decoded(1:7).eq.'000AAA ') ncount=-1
|
||||
|
@ -407,7 +407,9 @@ contains
|
||||
1011 format(i4.4,i4,i5,f6.2,f8.0,i4,3x,a22,' QRA64',i3)
|
||||
go to 100
|
||||
endif
|
||||
|
||||
|
||||
! write(*,3001) ft,nsum,qual,sync,bVHF
|
||||
!3001 format('a',3i3,f5.1,L3)
|
||||
if(ft.eq.0 .and. minsync.ge.0 .and. int(sync).lt.minsync) then
|
||||
write(*,1010) params%nutc,snr,dt,freq
|
||||
else
|
||||
@ -415,18 +417,19 @@ contains
|
||||
if(bVHF .and. ft.gt.0) then
|
||||
cflags='f '
|
||||
if(is_deep) then
|
||||
cflags(1:2)='d1'
|
||||
write(cflags(3:3),'(i1)') min(qual,9)
|
||||
if(qual.ge.10) cflags(3:3)='*'
|
||||
cflags='d '
|
||||
write(cflags(2:2),'(i1)') min(qual,9)
|
||||
if(qual.ge.10) cflags(2:2)='*'
|
||||
if(qual.lt.3) decoded(22:22)='?'
|
||||
endif
|
||||
if(is_average) then
|
||||
write(cflags(2:2),'(i1)') min(nsum,9)
|
||||
if(nsum.ge.10) cflags(2:2)='*'
|
||||
write(cflags(3:3),'(i1)') min(nsum,9)
|
||||
if(nsum.ge.10) cflags(3:3)='*'
|
||||
endif
|
||||
nap=ishft(ft,-2)
|
||||
if(nap.ne.0) then
|
||||
write(cflags(1:3),'(a1,i1)') 'a',nap
|
||||
if(nsum.lt.2) write(cflags(1:3),'(a1,i1," ")') 'a',nap
|
||||
if(nsum.ge.2) write(cflags(1:3),'(a1,2i1)') 'a',nap,min(nsum,9)
|
||||
endif
|
||||
endif
|
||||
csync='# '
|
||||
@ -445,6 +448,12 @@ contains
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
n=len(trim(decoded))
|
||||
if(n.eq.2 .or. n.eq.3) csync='# '
|
||||
if(cflags(1:1).eq.'f') then
|
||||
cflags(2:2)=cflags(3:3)
|
||||
cflags(3:3)=' '
|
||||
endif
|
||||
write(*,1010) params%nutc,snr,dt,freq,csync,decoded,cflags
|
||||
1010 format(i4.4,i4,f5.1,i5,1x,a2,1x,a22,1x,a3)
|
||||
endif
|
||||
|
@ -179,7 +179,6 @@ subroutine extract(s3,nadd,mode65,ntrials,naggressive,ndepth,nflip, &
|
||||
|
||||
if(nft.gt.0) exit
|
||||
enddo
|
||||
!write(*,*) nft
|
||||
if(nft.eq.0 .and. iand(ndepth,32).eq.32) then
|
||||
qmin=2.0 - 0.1*naggressive
|
||||
call timer('hint65 ',0)
|
||||
|
@ -76,7 +76,7 @@ contains
|
||||
character*22 decoded
|
||||
end type accepted_decode
|
||||
type(accepted_decode) dec(50)
|
||||
logical :: first_time,prtavg,single_decode,bVHF
|
||||
logical :: first_time,prtavg,single_decode,bVHF,clear_avg65
|
||||
|
||||
integer h0(0:11),d0(0:11)
|
||||
real r0(0:11)
|
||||
@ -90,7 +90,7 @@ contains
|
||||
|
||||
! 0 1 2 3 4 5 6 7 8 9 10 11
|
||||
data r0/0.70,0.72,0.74,0.76,0.78,0.80,0.82,0.84,0.86,0.88,0.90,0.90/
|
||||
data nutc0/-999/,nfreq0/-999/,nsave/0/
|
||||
data nutc0/-999/,nfreq0/-999/,nsave/0/,clear_avg65/.true./
|
||||
save
|
||||
|
||||
this%callback => callback
|
||||
@ -208,6 +208,7 @@ contains
|
||||
if(clearave) then
|
||||
nsum=0
|
||||
nsave=0
|
||||
clear_avg65=.true.
|
||||
endif
|
||||
|
||||
if(bVHF) then
|
||||
@ -235,19 +236,20 @@ contains
|
||||
naggressive,ndepth,ntol,mycall,hiscall,hisgrid,nQSOProgress, &
|
||||
ljt65apon,bVHF,sync2,a,dtx,nft,nspecial,qual, &
|
||||
nhist,nsmo,decoded)
|
||||
call timer('decod65a',1)
|
||||
if(nspecial.eq.0 .and. sync1.eq.5.0 .and. dtx.eq.2.5) cycle
|
||||
if(nspecial.eq.2) decoded='RO'
|
||||
if(nspecial.eq.3) decoded='RRR'
|
||||
if(nspecial.eq.4) decoded='73'
|
||||
call timer('decod65a',1)
|
||||
if(sync1.lt.float(minsync) .and. &
|
||||
decoded.eq.' ') nflip=0
|
||||
if(nft.ne.0) nsum=1
|
||||
|
||||
|
||||
nhard_min=param(1)
|
||||
nrtt1000=param(4)
|
||||
ntotal_min=param(5)
|
||||
nsmo=param(9)
|
||||
|
||||
|
||||
nfreq=nint(freq+a(1))
|
||||
ndrift=nint(2.0*a(2))
|
||||
if(bVHF) then
|
||||
@ -262,9 +264,9 @@ contains
|
||||
if(nsnr.lt.-30) nsnr=-30
|
||||
if(nsnr.gt.-1) nsnr=-1
|
||||
nftt=0
|
||||
|
||||
!********* DOES THIS STILL WORK WHEN NFT INCLUDES # OF AP SYMBOLS USED??
|
||||
if(nft.ne.1 .and. iand(ndepth,16).eq.16 .and. (.not.prtavg)) then
|
||||
if(nft.ne.1 .and. iand(ndepth,16).eq.16 .and. &
|
||||
sync1.ge.float(minsync) .and. (.not.prtavg)) then
|
||||
! Single-sequence FT decode failed, so try for an average FT decode.
|
||||
if(nutc.ne.nutc0 .or. abs(nfreq-nfreq0).gt.ntol) then
|
||||
! This is a new minute or a new frequency, so call avg65.
|
||||
@ -273,13 +275,14 @@ contains
|
||||
nsave=nsave+1
|
||||
nsave=mod(nsave-1,64)+1
|
||||
call avg65(nutc,nsave,sync1,dtx,nflip,nfreq,mode65,ntol, &
|
||||
ndepth,nagain,ntrials,naggressive,clearave,neme,mycall, &
|
||||
hiscall,hisgrid,nftt,avemsg,qave,deepave,nsum,ndeepave, &
|
||||
nQSOProgress,ljt65apon)
|
||||
ndepth,nagain,ntrials,naggressive,clear_avg65,neme, &
|
||||
mycall,hiscall,hisgrid,nftt,avemsg,qave,deepave,nsum, &
|
||||
ndeepave,nQSOProgress,ljt65apon)
|
||||
nsmo=param(9)
|
||||
nqave=int(qave)
|
||||
|
||||
if (associated(this%callback) .and. nsum.ge.2) then
|
||||
if (associated(this%callback) .and.nftt.ge.1 .and. nsum.ge.2) then
|
||||
! Display a decoded message obtained by averaging 2 or more transmissions
|
||||
call this%callback(sync1,nsnr,dtx-1.0,nfreq,ndrift, &
|
||||
nflip,width,avemsg,nftt,nqave,nsmo,nsum,minsync)
|
||||
prtavg=.true.
|
||||
@ -288,14 +291,15 @@ contains
|
||||
endif
|
||||
endif
|
||||
|
||||
if(nftt.eq.1) then
|
||||
! nft=1
|
||||
decoded=avemsg
|
||||
go to 5
|
||||
endif
|
||||
if(nftt.eq.0) go to 5
|
||||
! if(nftt.eq.1) then
|
||||
!! nft=1
|
||||
! decoded=avemsg
|
||||
! go to 5
|
||||
! endif
|
||||
n=naggressive
|
||||
rtt=0.001*nrtt1000
|
||||
if(nft.lt.2 .and. minsync.ge.0 .and. nspecial.eq.0) then
|
||||
if(nft.lt.2 .and. minsync.ge.0 .and. nspecial.eq.0 .and. .not.bVHF) then
|
||||
if(nhard_min.gt.50) cycle
|
||||
if(nhard_min.gt.h0(n)) cycle
|
||||
if(ntotal_min.gt.d0(n)) cycle
|
||||
@ -305,7 +309,8 @@ contains
|
||||
5 continue
|
||||
if(decoded.eq.decoded0 .and. abs(freq-freq0).lt. 3.0 .and. &
|
||||
minsync.ge.0) cycle !Don't display dupes
|
||||
if(decoded.ne.' ' .or. minsync.lt.0) then
|
||||
! if(decoded.ne.' ' .or. minsync.lt.0) then
|
||||
if(decoded.ne.' ' .or. bVHF) then
|
||||
if(nsubtract.eq.1) then
|
||||
call timer('subtr65 ',0)
|
||||
call subtract65(dd,npts,freq,dtx)
|
||||
@ -319,7 +324,7 @@ contains
|
||||
exit
|
||||
endif
|
||||
enddo
|
||||
if(ndupe.ne.1 .and. sync1.ge.float(minsync)) then
|
||||
if(ndupe.ne.1 .and. ((sync1.ge.float(minsync)) .or. bVHF)) then
|
||||
if(ipass.eq.1) n65a=n65a + 1
|
||||
if(ipass.eq.2) n65b=n65b + 1
|
||||
if(ndecoded.lt.50) ndecoded=ndecoded+1
|
||||
@ -329,7 +334,7 @@ contains
|
||||
dec(ndecoded)%decoded=decoded
|
||||
nqual=min(int(qual),9999)
|
||||
|
||||
if (associated(this%callback)) then
|
||||
if(associated(this%callback)) then
|
||||
call this%callback(sync1,nsnr,dtx-1.0,nfreq,ndrift, &
|
||||
nflip,width,decoded,nft,nqual,nsmo,1,minsync)
|
||||
end if
|
||||
@ -345,8 +350,8 @@ contains
|
||||
end subroutine decode
|
||||
|
||||
subroutine avg65(nutc,nsave,snrsync,dtxx,nflip,nfreq,mode65,ntol,ndepth, &
|
||||
nagain, ntrials,naggressive,clearave,neme,mycall,hiscall,hisgrid,nftt, &
|
||||
avemsg,qave,deepave,nsum,ndeepave,nQSOProgress,ljt65apon)
|
||||
nagain, ntrials,naggressive,clear_avg65,neme,mycall,hiscall,hisgrid, &
|
||||
nftt,avemsg,qave,deepave,nsum,ndeepave,nQSOProgress,ljt65apon)
|
||||
|
||||
! Decodes averaged JT65 data
|
||||
|
||||
@ -369,20 +374,21 @@ contains
|
||||
real s3c(64,63)
|
||||
real dtsave(MAXAVE)
|
||||
real syncsave(MAXAVE)
|
||||
logical first,clearave,ljt65apon
|
||||
logical first,clear_avg65,ljt65apon
|
||||
data first/.true./
|
||||
save
|
||||
|
||||
if(first .or. clearave) then
|
||||
if(first .or. clear_avg65) then
|
||||
iutc=-1
|
||||
nfsave=0
|
||||
dtdiff=0.2
|
||||
first=.false.
|
||||
s3save=0.
|
||||
s1save=0.
|
||||
nsave=1 !### ???
|
||||
! Silence compiler warnings
|
||||
if(nagain .and. ndeepave.eq.-99 .and. neme.eq.-99) stop
|
||||
first=.false.
|
||||
clear_avg65=.false.
|
||||
endif
|
||||
|
||||
do i=1,64
|
||||
@ -398,7 +404,10 @@ contains
|
||||
nflipsave(nsave)=nflip
|
||||
s1save(-255:256,1:126,nsave)=s1
|
||||
s3save(1:64,1:63,nsave)=s3a
|
||||
|
||||
avemsg=' '
|
||||
deepbest=' '
|
||||
nfttbest=0
|
||||
|
||||
10 syncsum=0.
|
||||
dtsum=0.
|
||||
nfsum=0
|
||||
@ -409,7 +418,7 @@ contains
|
||||
|
||||
do i=1,MAXAVE !Consider all saved spectra
|
||||
cused(i)='.'
|
||||
if(iutc(i).lt.0) cycle
|
||||
if(iutc(i).lt.0) exit
|
||||
if(mod(iutc(i),2).ne.mod(nutc,2)) cycle !Use only same (odd/even) seq
|
||||
if(abs(dtxx-dtsave(i)).gt.dtdiff) cycle !DT must match
|
||||
if(abs(nfreq-nfsave(i)).gt.ntol) cycle !Freq must match
|
||||
@ -442,7 +451,6 @@ contains
|
||||
enddo
|
||||
if(nsum.lt.2) go to 900
|
||||
|
||||
nftt=0
|
||||
df=1378.125/512.0
|
||||
|
||||
! Do the smoothing loop
|
||||
@ -455,6 +463,7 @@ contains
|
||||
endif
|
||||
nn=0
|
||||
do ismo=minsmo,maxsmo
|
||||
nftt=0
|
||||
if(ismo.gt.0) then
|
||||
do j=1,126
|
||||
call smo121(s1b(-255,j),512)
|
||||
@ -492,7 +501,7 @@ contains
|
||||
nsmo=ismo
|
||||
param(9)=nsmo
|
||||
go to 900
|
||||
else if(nftt.eq.2) then
|
||||
else if(nftt.ge.2) then
|
||||
if(qual.gt.qualbest) then
|
||||
deepbest=avemsg
|
||||
qualbest=qual
|
||||
@ -502,7 +511,6 @@ contains
|
||||
endif
|
||||
endif
|
||||
enddo
|
||||
|
||||
if(nfttbest.eq.2) then
|
||||
avemsg=deepbest !### ???
|
||||
deepave=deepbest
|
||||
@ -512,7 +520,7 @@ contains
|
||||
nftt=nfttbest
|
||||
endif
|
||||
900 continue
|
||||
|
||||
|
||||
return
|
||||
end subroutine avg65
|
||||
|
||||
|
@ -169,23 +169,19 @@ program jt65sim
|
||||
if(csubmode.eq.'B' .and. snrdb.eq.0.0) xsnr=-21 - isig
|
||||
if(csubmode.eq.'C' .and. snrdb.eq.0.0) xsnr=-21 - isig
|
||||
|
||||
!###
|
||||
! call1="K1ABC"
|
||||
! ic3=65+mod(isig-1,26)
|
||||
! ic2=65+mod((isig-1)/26,26)
|
||||
! ic1=65
|
||||
! call2="W9"//char(ic1)//char(ic2)//char(ic3)
|
||||
! write(msg,1010) call1,call2,nint(xsnr)
|
||||
!1010 format(a5,1x,a5,1x,i3.2)
|
||||
!###
|
||||
call packmsg(msg,dgen,itype) !Pack message into 12 six-bit bytes
|
||||
call rs_encode(dgen,sent) !Encode using RS(63,12)
|
||||
call interleave63(sent,1) !Interleave channel symbols
|
||||
call graycode65(sent,63,1) !Apply Gray code
|
||||
|
||||
nprc_test=0
|
||||
i1=len(trim(msg))
|
||||
if(i1.gt.10) then
|
||||
if(msg(i1-3:i1).eq.' OOO') nprc_test=1
|
||||
endif
|
||||
k=0
|
||||
do j=1,nsym !Insert sync and data into itone()
|
||||
if(nprc(j).eq.0) then
|
||||
if(nprc(j).eq.nprc_test) then
|
||||
k=k+1
|
||||
itone(j)=sent(k)+2
|
||||
else
|
||||
|
@ -2468,7 +2468,7 @@ void MainWindow::on_actionCopyright_Notice_triggered()
|
||||
"\"The algorithms, source code, look-and-feel of WSJT-X and related "
|
||||
"programs, and protocol specifications for the modes FSK441, FT8, JT4, "
|
||||
"JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) "
|
||||
"2001-2019 by one or more of the following authors: Joseph Taylor, "
|
||||
"2001-2020 by one or more of the following authors: Joseph Taylor, "
|
||||
"K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, "
|
||||
"IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; "
|
||||
"Philip Karn, KA9Q; and other members of the WSJT Development Group.\"");
|
||||
@ -2593,15 +2593,15 @@ void MainWindow::on_actionColors_triggered()
|
||||
|
||||
void MainWindow::on_actionMessage_averaging_triggered()
|
||||
{
|
||||
if(!m_msgAvgWidget) {
|
||||
if(m_msgAvgWidget == NULL) {
|
||||
m_msgAvgWidget.reset (new MessageAveraging {m_settings, m_config.decoded_text_font ()});
|
||||
|
||||
// Connect signals from Message Averaging window
|
||||
connect (this, &MainWindow::finished, m_msgAvgWidget.data (), &MessageAveraging::close);
|
||||
}
|
||||
m_msgAvgWidget->showNormal();
|
||||
m_msgAvgWidget->raise ();
|
||||
m_msgAvgWidget->activateWindow ();
|
||||
m_msgAvgWidget->raise();
|
||||
m_msgAvgWidget->activateWindow();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionOpen_triggered() //Open File
|
||||
@ -3086,17 +3086,6 @@ void MainWindow::decodeDone ()
|
||||
if(dec_data.params.nzhsym==m_earlyDecode2) m_blankLine=false;
|
||||
}
|
||||
if(SpecOp::FOX == m_config.special_op_id()) houndCallers();
|
||||
|
||||
/*
|
||||
auto now = QDateTime::currentDateTimeUtc();
|
||||
double tsec = fmod(double(now.toMSecsSinceEpoch()),86400000.0)/1000.0;
|
||||
double tseq = fmod(double(now.toMSecsSinceEpoch() ),1000.0*m_TRperiod)/1000.0;
|
||||
if(tseq < 0.5*m_TRperiod) tseq+= m_TRperiod;
|
||||
QString t="";
|
||||
t.sprintf("ee decodeDone %11.3f %5d %5d %7.3f ",tsec,m_ihsym,m_ihsym,tseq);
|
||||
qDebug().noquote() << t << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.zzz");
|
||||
*/
|
||||
|
||||
to_jt9(m_ihsym,-1,1); //Tell jt9 we know it has finished
|
||||
}
|
||||
|
||||
@ -3104,19 +3093,18 @@ void MainWindow::readFromStdout() //readFromStdout
|
||||
{
|
||||
while(proc_jt9.canReadLine()) {
|
||||
auto line_read = proc_jt9.readLine ();
|
||||
if (auto p = std::strpbrk (line_read.constData (), "\n\r"))
|
||||
{
|
||||
// truncate before line ending chars
|
||||
line_read = line_read.left (p - line_read.constData ());
|
||||
}
|
||||
if (auto p = std::strpbrk (line_read.constData (), "\n\r")) {
|
||||
// truncate before line ending chars
|
||||
line_read = line_read.left (p - line_read.constData ());
|
||||
}
|
||||
if(m_mode!="FT8" and m_mode!="FT4") {
|
||||
//Pad 22-char msg to at least 37 chars
|
||||
line_read = line_read.left(43) + " " + line_read.mid(43);
|
||||
line_read = line_read.left(44) + " " + line_read.mid(44);
|
||||
}
|
||||
bool bAvgMsg=false;
|
||||
int navg=0;
|
||||
|
||||
if(line_read.indexOf("<DecodeFinished>") >= 0) {
|
||||
// qDebug() << "bb" << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.zzz") << line_read;
|
||||
if(m_mode!="FT8" or dec_data.params.nzhsym==50) m_nDecodes=0;
|
||||
if(m_mode=="QRA64") m_wideGraph->drawRed(0,0);
|
||||
m_bDecoded = line_read.mid(20).trimmed().toInt() > 0;
|
||||
@ -3140,17 +3128,26 @@ void MainWindow::readFromStdout() //readFromStdout
|
||||
m_nDecodes+=1;
|
||||
ndecodes_label.setText(QString::number(m_nDecodes));
|
||||
if(m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64") {
|
||||
int n=line_read.indexOf("f");
|
||||
if(n<0) n=line_read.indexOf("d");
|
||||
if(n>0) {
|
||||
QString tt=line_read.mid(n+1,1);
|
||||
navg=tt.toInt();
|
||||
if(navg==0) {
|
||||
char c = tt.data()->toLatin1();
|
||||
if(int(c)>=65 and int(c)<=90) navg=int(c)-54;
|
||||
}
|
||||
if(navg>1 or line_read.indexOf("f*")>0) bAvgMsg=true;
|
||||
int nf=line_read.indexOf("f");
|
||||
if(nf>0) {
|
||||
navg=line_read.mid(nf+1,1).toInt();
|
||||
if(line_read.indexOf("f*")>0) navg=10;
|
||||
}
|
||||
int nd=-1;
|
||||
if(nf<0) nd=line_read.indexOf("d");
|
||||
if(nd>0) {
|
||||
navg=line_read.mid(nd+2,1).toInt();
|
||||
if(line_read.mid(nd+2,1)=="*") navg=10;
|
||||
}
|
||||
if(m_mode=="JT65") {
|
||||
int na=-1;
|
||||
if(nf<0 and nd<0) na=line_read.indexOf("a");
|
||||
if(na>0) {
|
||||
navg=line_read.mid(na+2,1).toInt();
|
||||
if(line_read.mid(na+2,1)=="*") navg=10;
|
||||
}
|
||||
}
|
||||
if(navg>=2) bAvgMsg=true;
|
||||
}
|
||||
write_all("Rx",line_read.trimmed());
|
||||
if (m_config.insert_blank () && m_blankLine && SpecOp::FOX != m_config.special_op_id()) {
|
||||
@ -3237,7 +3234,8 @@ void MainWindow::readFromStdout() //readFromStdout
|
||||
if(SpecOp::FOX!=m_config.special_op_id() and (for_us or (abs(audioFreq - m_wideGraph->rxFreq()) <= 10))) bDisplayRight=true;
|
||||
}
|
||||
} else {
|
||||
if(abs(audioFreq - m_wideGraph->rxFreq()) <= 10) bDisplayRight=true;
|
||||
if((abs(audioFreq - m_wideGraph->rxFreq()) <= 10) and
|
||||
!m_config.enable_VHF_features()) bDisplayRight=true;
|
||||
}
|
||||
|
||||
if (bDisplayRight) {
|
||||
@ -4025,9 +4023,7 @@ void MainWindow::guiUpdate()
|
||||
|
||||
//Once per second:
|
||||
if(nsec != m_sec0) {
|
||||
// qDebug() << "onesec" << m_config.force_call_1st();
|
||||
// if((!m_msgAvgWidget or (m_msgAvgWidget and !m_msgAvgWidget->isVisible()))
|
||||
// and (SpecOp::NONE < m_config.special_op_id()) and (SpecOp::HOUND > m_config.special_op_id())) on_actionFox_Log_triggered();
|
||||
// qDebug() << "onesec" << m_mode;
|
||||
if(m_freqNominal!=0 and m_freqNominal<50000000 and m_config.enable_VHF_features()) {
|
||||
if(!m_bVHFwarned) vhfWarning();
|
||||
} else {
|
||||
@ -7293,8 +7289,11 @@ void::MainWindow::VHF_features_enabled(bool b)
|
||||
ui->actionMessage_averaging->setEnabled(b);
|
||||
ui->actionEnable_AP_DXcall->setVisible (m_mode=="QRA64");
|
||||
ui->actionEnable_AP_JT65->setVisible (b && m_mode=="JT65");
|
||||
|
||||
if(!b && m_msgAvgWidget and (SpecOp::FOX != m_config.special_op_id()) and !m_config.autoLog()) {
|
||||
if(m_msgAvgWidget->isVisible()) m_msgAvgWidget->close();
|
||||
if(m_msgAvgWidget->isVisible() and m_mode!="JT4" and m_mode!="JT9" and m_mode!="JT65") {
|
||||
m_msgAvgWidget->close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user