From a5e82ac94cca1306bd73606547874884963f49da Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Tue, 4 Dec 2018 20:01:55 -0600 Subject: [PATCH 1/7] Delete an unused routine. Fix a typo in a comment. --- CMakeLists.txt | 1 - lib/ft8/osd174.f90 | 365 ----------------------------------------- widgets/mainwindow.cpp | 2 +- 3 files changed, 1 insertion(+), 367 deletions(-) delete mode 100644 lib/ft8/osd174.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index bff2f543a..a2717dca8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -508,7 +508,6 @@ set (wsjt_FSRCS lib/msk144sim.f90 lib/mskrtd.f90 lib/77bit/my_hash.f90 - lib/ft8/osd174.f90 lib/wsprd/osdwspr.f90 lib/ft8/osd174_91.f90 lib/pctile.f90 diff --git a/lib/ft8/osd174.f90 b/lib/ft8/osd174.f90 deleted file mode 100644 index 45d7faa4b..000000000 --- a/lib/ft8/osd174.f90 +++ /dev/null @@ -1,365 +0,0 @@ -subroutine osd174(llr,apmask,ndeep,decoded,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (174,87) code. -! -include "ldpc_174_87_params.f90" - -integer*1 apmask(N),apmaskr(N) -integer*1 gen(K,N) -integer*1 genmrb(K,N),g2(N,K) -integer*1 temp(K),m0(K),me(K),mi(K),misub(K),e2sub(N-K),e2(N-K),ui(N-K) -integer*1 r2pat(N-K) -integer indices(N),nxor(N) -integer*1 cw(N),ce(N),c0(N),hdec(N) -integer*1 decoded(K) -integer indx(N) -real llr(N),rx(N),absrx(N) -logical first,reset -data first/.true./ -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,22 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - irow=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(irow,i)=1 - enddo - enddo - enddo - do irow=1,K - gen(irow,M+irow)=1 - enddo -first=.false. -endif - -! Re-order received vector to place systematic msg bits at the end. -rx=llr(colorder+1) -apmaskr=apmask(colorder+1) - -! Hard decisions on the received word. -hdec=0 -where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. -absrx=abs(rx) -call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. -do i=1,N - genmrb(1:K,i)=gen(1:K,indx(N+1-i)) - indices(i)=indx(N+1-i) -enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:K in order of decreasing reliability (more or less). -do id=1,K ! diagonal element indices - do icol=id,K+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:K)=genmrb(1:K,id) - genmrb(1:K,id)=genmrb(1:K,icol) - genmrb(1:K,icol)=temp(1:K) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,K - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo -enddo - -g2=transpose(genmrb) - -! The hard decisions for the K MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - -hdec=hdec(indices) ! hard decisions from received symbols -m0=hdec(1:K) ! zero'th order message -absrx=absrx(indices) -rx=rx(indices) -apmaskr=apmaskr(indices) - -call mrbencode(m0,c0,g2,N,K) -nxor=ieor(c0,hdec) -nhardmin=sum(nxor) -dmin=sum(nxor*absrx) - -cw=c0 -ntotal=0 -nrejected=0 - -if(ndeep.eq.0) goto 998 ! norder=0 -if(ndeep.gt.5) ndeep=5 -if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=40 - ntheta=12 -elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=40 - ntheta=12 -elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=14 -elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=0 - nt=40 - ntheta=12 - ntau=19 -elseif(ndeep.eq.5) then - nord=2 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 -endif - -do iorder=1,nord - misub(1:K-iorder)=0 - misub(K-iorder+1:K)=1 - iflag=K-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:K),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - e2=e2sub - nd1Kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:K),hdec(1:K))*absrx(1:K)) - else - e2=ieor(e2sub,g2(K+1:N,n1)) - nd1Kpt=sum(e2(1:nt))+2 - endif - if(nd1Kpt .le. ntheta) then - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(K+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(K+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1Kptbest=nd1Kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat(misub,k,iorder,iflag) - enddo -enddo - -if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=K,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(K+1:K+ntau,i1),g2(K+1:K+ntau,i2)) - call boxit(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:K-nord)=0 - misub(K-nord+1:K)=1 - iflag=K-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:K),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat(misub,K,nord,iflag) - enddo -endif - -998 continue -! Re-order the codeword to place message bits at the end. -cw(indices)=cw -hdec(indices)=hdec -decoded=cw(M+1:N) -cw(colorder+1)=cw ! put the codeword back into received-word order -return -end subroutine osd174 - -subroutine mrbencode(me,codeword,g2,N,K) -integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo -return -end subroutine mrbencode - -subroutine nextpat(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat - -subroutine boxit(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(4000,2),fp(0:525000),np(4000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit - -subroutine fetchit(reset,e2,ntau,i1,i2) - integer indexes(4000,2),fp(0:525000),np(4000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit - diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b265ad7ba..45ff68254 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4793,7 +4793,7 @@ bool MainWindow::stdCall(QString w) if(i1==99 and (c>="A" and c<="Z")) i1=i; if(c>="0" and c<="9") i2=i; } - if(i1!=0 and i1!=1) return false; //One of the firat two characters must be a letter + if(i1!=0 and i1!=1) return false; //One of the first two characters must be a letter if(i2>2) return false; //No digits allowed after the 3rd character for(int i=i2+1; i Date: Wed, 5 Dec 2018 07:00:20 -0500 Subject: [PATCH 2/7] Fix a typo. --- doc/user_guide/en/new_features.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index aed97945a..2ed33ffd2 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -13,7 +13,7 @@ added to _WSJT-X_ since Version 1.9.1: * Integration with N1MM+ and WriteLog for contesting -* IMproved support for compound and nonstandard callsigns +* Improved support for compound and nonstandard callsigns * Nearly equal (or better) sensitivity compared to old protocols From d8f7354c0e088e4840c528d0a050fc6258cad66a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 5 Dec 2018 08:19:59 -0500 Subject: [PATCH 3/7] Make fmtmsg aware of both message sizes, 22 and 37 chars. --- lib/fmtmsg.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/fmtmsg.f90 b/lib/fmtmsg.f90 index 2ceb81554..81789e2a9 100644 --- a/lib/fmtmsg.f90 +++ b/lib/fmtmsg.f90 @@ -1,16 +1,16 @@ subroutine fmtmsg(msg,iz) - character*22 msg + character*(*) msg ! Convert all letters to upper case - iz=22 - do i=1,22 + iz=len(msg) + do i=1,iz if(msg(i:i).ge.'a' .and. msg(i:i).le.'z') & msg(i:i)= char(ichar(msg(i:i))+ichar('A')-ichar('a')) if(msg(i:i).ne.' ') iz=i enddo - do iter=1,5 !Collapse multiple blanks into one + do iter=1,37 !Collapse multiple blanks into one ib2=index(msg(1:iz),' ') if(ib2.lt.1) go to 100 msg=msg(1:ib2)//msg(ib2+2:) From 93377c789e979a81cdf399d0b72110fa7253b03d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 5 Dec 2018 09:52:13 -0500 Subject: [PATCH 4/7] More tweaks to the v2.0 User Guide. --- doc/common/links.adoc | 2 +- doc/user_guide/en/images/colors.png | Bin 29143 -> 30521 bytes doc/user_guide/en/settings-colors.adoc | 13 ++++++++----- doc/user_guide/en/settings-frequencies.adoc | 6 +++--- doc/user_guide/en/tutorial-example3.adoc | 7 ++++--- doc/user_guide/en/wsjtx-main.adoc | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/doc/common/links.adoc b/doc/common/links.adoc index 754b93570..158400854 100644 --- a/doc/common/links.adoc +++ b/doc/common/links.adoc @@ -67,7 +67,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes. :fmt_group: https://groups.yahoo.com/neo/groups/FMT-nuts/info[FMT Group] :fmt_k5cm: http://www.k5cm.com/[FMT Event Info] :fmt_wspr: http://www.physics.princeton.edu/pulsar/K1JT/FMT_User.pdf[Accurate Frequency Measurements with your WSPR Setup] -:ft8_tips: http://www.physics.princeton.edu/pulsar/K1JT/FT8_Operating_Tips.pdf[here] +:ft8_tips: http://www.g4ifb.com/FT8_Hinson_tips_for_HF_DXers.pdf[FT8 Operating Guide] :ft8_DXped: http://physics.princeton.edu/pulsar/k1jt/FT8_DXpedition_Mode.pdf[FT8 DXpedition Mode] :gnu_gpl: http://www.gnu.org/licenses/gpl-3.0.txt[GNU General Public License] :homepage: http://physics.princeton.edu/pulsar/K1JT/[WSJT Home Page] diff --git a/doc/user_guide/en/images/colors.png b/doc/user_guide/en/images/colors.png index 7c6813529f0c65aa52e230a1110802a8e72113d1..8845ada9cc9a236068e77b5f72f226550c172eb4 100644 GIT binary patch literal 30521 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 EKeB>fFaQ7m literal 29143 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 diff --git a/doc/user_guide/en/settings-colors.adoc b/doc/user_guide/en/settings-colors.adoc index 3a67d228a..fc2f748bc 100644 --- a/doc/user_guide/en/settings-colors.adoc +++ b/doc/user_guide/en/settings-colors.adoc @@ -1,7 +1,10 @@ image::colors.png[align="center",alt="Colors Screen"] -_WSJT-X_ uses colors to highlight decoded messages containing -information of particular interest. Check the box to select any -that interest you. Drag any line up or down to raise or lower -its logical priority. Right-click any line to select a new -foreground or background color. +_WSJT-X_ uses colors to highlight decoded CQ messages of particular +interest. Check the box *Show DXCC, grid, and worked-before status* +on the *Settings | General* tab, and any boxes of interest to you on +the *Colors* tab. You can drag any line up or down to raise or lower +its logical priority. Right-click any line to set a new foreground or +background color. Foreground and background colors are applied +separately, and careful choices of foreground, background, and +priority can provide two indications of worked-before status. diff --git a/doc/user_guide/en/settings-frequencies.adoc b/doc/user_guide/en/settings-frequencies.adoc index bebf6a313..5cdf26dbd 100644 --- a/doc/user_guide/en/settings-frequencies.adoc +++ b/doc/user_guide/en/settings-frequencies.adoc @@ -4,9 +4,9 @@ image::settings-frequencies.png[align="center",alt="Frequency Screen"] _Working Frequencies_: By default the *Working Frequencies* table -contains a list of frequencies conventionally used for modes JT4, JT9, -JT65, MSK144, WSPR, and Echo. Conventions may change with time or -by user preference; you can modify the frequency table as desired. +contains a list of frequencies conventionally used for modes FT8, JT4, +JT9, JT65, MSK144, WSPR, and Echo. Conventions may change with time +or by user preference; you can modify the frequency table as desired. - To change an existing entry, double-click to edit it, type a desired frequency in MHz or select from the drop down list of options, then diff --git a/doc/user_guide/en/tutorial-example3.adoc b/doc/user_guide/en/tutorial-example3.adoc index 3f2ee03f6..931067760 100644 --- a/doc/user_guide/en/tutorial-example3.adoc +++ b/doc/user_guide/en/tutorial-example3.adoc @@ -46,13 +46,14 @@ when double-clicking. NOTE: To avoid QRM from competing callers, it is frequently desirable to answer a CQ on a different frequency from that of the CQing station. The same is true when you tail-end another QSO. Choose a Tx -frequency that appears to be not in use. +frequency that appears to be not in use. You might want to check the +box *Hold Tx Freq*. NOTE: Keyboard shortcuts *Shift+F11* and *Shift+F12* provide an easy way to move your Tx frequency down or up in 60 Hz steps. -NOTE: Further helpful tips on FT8 operating procedures are available -{ft8_tips}. Thanks to ZL2IFB! +NOTE: An online {ft8_tips} by ZL2IFB offers many helpful tips on +operating procedures. .FT8 DXpedition Mode: diff --git a/doc/user_guide/en/wsjtx-main.adoc b/doc/user_guide/en/wsjtx-main.adoc index aa4a9aa57..704ad74c4 100644 --- a/doc/user_guide/en/wsjtx-main.adoc +++ b/doc/user_guide/en/wsjtx-main.adoc @@ -1,5 +1,5 @@ // This is a comment line, anything with // is ignored at process time. -= _WSJT-X_ User Guide += _WSJT-X 2.0_ User Guide Joseph H Taylor, Jr, K1JT :revnumber: {VERSION} // For web-pages, adding :badges: is ok, but is a security issue for From c8853cb90cce82e46a0ecfabb9c596abe32d47ae Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 5 Dec 2018 13:47:36 -0600 Subject: [PATCH 5/7] Use regex to decide how the GUI formats the Tx messages for subsequent packing by packjt77. Ensure that C4XMAS is properly flagged as a non-standard callsign. --- widgets/mainwindow.cpp | 32 ++++++++++---------------------- widgets/mainwindow.h | 2 +- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 45ff68254..841ae496c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4777,29 +4777,17 @@ void MainWindow::abortQSO() ui->txrb6->setChecked(true); } -bool MainWindow::stdCall(QString w) +bool MainWindow::stdCall(QString const& w) { - int n=w.trimmed().length(); -//Treat /P and /R as special cases: strip them off for this test. - if(w.mid(n-2,2)=="/P") w=w.left(n-2); - if(w.mid(n-2,2)=="/R") w=w.left(n-2); - n=w.trimmed().length(); - if(n>6) return false; //Callsigns longer than 6 chars are nonstandard - w=w.toUpper(); - int i1=99; // index of first letter - int i2=-1; // index of last digit - for(int i=0; i="A" and c<="Z")) i1=i; - if(c>="0" and c<="9") i2=i; - } - if(i1!=0 and i1!=1) return false; //One of the first two characters must be a letter - if(i2>2) return false; //No digits allowed after the 3rd character - for(int i=i2+1; i"Z") return false; //Anything after final digit must be a letter - } - return true; + static QRegularExpression standard_call_re { + R"( + ^\s* # optional leading spaces + ( [A-Z]{0,2} | [A-Z][0-9] | [0-9][A-Z] ) # part 1 + ( [0-9][A-Z]{0,3} ) # part 2 + (/R | /P)? # optional suffix + \s*$ # optional trailing spaces + )", QRegularExpression::CaseInsensitiveOption | QRegularExpression::ExtendedPatternSyntaxOption}; + return standard_call_re.match (w).hasMatch (); } void MainWindow::genStdMsgs(QString rpt, bool unconditional) diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 6a2527440..428ea6890 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -305,7 +305,7 @@ private slots: void not_GA_warning_message (); void checkMSK144ContestType(); int setTxMsg(int n); - bool stdCall(QString w); + bool stdCall(QString const& w); private: Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo, From 044a126278441549b2e60d9b33d62460f0e048e4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 5 Dec 2018 15:54:42 -0500 Subject: [PATCH 6/7] Proposed wording for the v2.0 GA startup message. --- widgets/mainwindow.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b265ad7ba..33f74911e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -955,17 +955,12 @@ void MainWindow::not_GA_warning_message () QDateTime timeout=QDateTime(QDate(2018,12,31)); MessageBox::critical_message (this, - "This version of WSJT-X is a beta-level Release Candidate.\n\n" - "IMPORTANT: WSJT-X 2.0 cannot communicate with other\n" - "stations using the FT8 or MSK144 protocols in WSJT-X v1.9.1\n" - "or earlier.\n\n" - "On December 10, 2018, the new FT8 and MSK144 protocols\n" - "will become the standard. Everyone should upgrade to\n" - "WSJT-X 2.0 by January 1, 2019.\n\n" - "On-the-air use carries an obligation to report problems\n" - "to the WSJT Development group and to upgrade to a GA\n" - "(General Availability) release when it becomes available.\n\n" - "This version cannot be used after December 31, 2018.\n\n"); + "IMPORTANT: New protocols for the FT8 and MSK144 modes\n" + "became the world-wide standards on December 10, 2019.\n\n" + "WSJT-X 2.0 cannot communicate in these modes with other\n" + "stations using WSJT-X v1.9.1 or earlier.\n\n" + "Please help by urging everyone to upgrade to WSJT-X 2.0\n" + "no later than January 1, 2019.\n"); if(now.daysTo(timeout) < 0) Q_EMIT finished(); } From 337bae6d0d14bf62a4d36d0060e2e99422dfc82c Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Wed, 5 Dec 2018 16:06:33 -0600 Subject: [PATCH 7/7] Housekeeping. Remove unused code and unused variables. Silence some compiler warnings. --- CMakeLists.txt | 4 - lib/crc.f90 | 16 -- lib/crc12.cpp | 31 --- lib/decoder.f90 | 4 +- lib/ft8/bpdecode174.f90 | 401 -------------------------------------- lib/ft8/chkcrc12a.f90 | 24 --- lib/ft8/foxgen.f90 | 1 - lib/ft8/ft8apset.f90 | 1 - lib/ft8/ft8b.f90 | 5 +- lib/ft8/ft8code.f90 | 9 +- lib/ft8/ft8sim.f90 | 2 +- lib/msk144code.f90 | 8 +- lib/msk144decodeframe.f90 | 2 +- lib/msk144sim.f90 | 1 - 14 files changed, 12 insertions(+), 497 deletions(-) delete mode 100644 lib/crc12.cpp delete mode 100644 lib/ft8/bpdecode174.f90 delete mode 100644 lib/ft8/chkcrc12a.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index a2717dca8..3e7e816bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -322,14 +322,12 @@ set (wsjtx_CXXSRCS set (wsjt_CXXSRCS lib/crc10.cpp - lib/crc12.cpp lib/crc13.cpp lib/crc14.cpp ) # deal with a GCC v6 UB error message set_source_files_properties ( lib/crc10.cpp - lib/crc12.cpp lib/crc13.cpp lib/crc14.cpp PROPERTIES COMPILE_FLAGS -fpermissive) @@ -384,13 +382,11 @@ set (wsjt_FSRCS lib/ft8/baseline.f90 lib/bpdecode40.f90 lib/bpdecode128_90.f90 - lib/ft8/bpdecode174.f90 lib/ft8/bpdecode174_91.f90 lib/baddata.f90 lib/calibrate.f90 lib/ccf2.f90 lib/ccf65.f90 - lib/ft8/chkcrc12a.f90 lib/ft8/chkcrc13a.f90 lib/ft8/chkcrc14a.f90 lib/chkcall.f90 diff --git a/lib/crc.f90 b/lib/crc.f90 index a36e364f9..f0cd17e32 100644 --- a/lib/crc.f90 +++ b/lib/crc.f90 @@ -34,22 +34,6 @@ module crc integer (c_int), value :: length end function crc13_check - function crc12 (data, length) bind (C, name="crc12") - use, intrinsic :: iso_c_binding, only: c_short, c_ptr, c_int - implicit none - integer (c_short) :: crc12 - type (c_ptr), value :: data - integer (c_int), value :: length - end function crc12 - - function crc12_check (data, length) bind (C, name="crc12_check") - use, intrinsic :: iso_c_binding, only: c_bool, c_ptr, c_int - implicit none - logical (c_bool) :: crc12_check - type (c_ptr), value :: data - integer (c_int), value :: length - end function crc12_check - function crc10 (data, length) bind (C, name="crc10") use, intrinsic :: iso_c_binding, only: c_short, c_ptr, c_int implicit none diff --git a/lib/crc12.cpp b/lib/crc12.cpp deleted file mode 100644 index 44e50fe71..000000000 --- a/lib/crc12.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -extern "C" -{ - short crc12 (unsigned char const * data, int length); - bool crc12_check (unsigned char const * data, int length); -} - -#define POLY 0xc06 - -#ifdef BOOST_NO_CXX11_CONSTEXPR -#define TRUNCATED_POLYNOMIAL POLY -#else -namespace -{ - unsigned long constexpr TRUNCATED_POLYNOMIAL = POLY; -} -#endif - -// assumes CRC is last 16 bits of the data and is set to zero -// caller should assign the returned CRC into the message in big endian byte order -short crc12 (unsigned char const * data, int length) -{ - return boost::augmented_crc<12, TRUNCATED_POLYNOMIAL> (data, length); -} - -bool crc12_check (unsigned char const * data, int length) -{ - return !boost::augmented_crc<12, TRUNCATED_POLYNOMIAL> (data, length); -} diff --git a/lib/decoder.f90 b/lib/decoder.f90 index e1fb40436..730c59d12 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -470,8 +470,8 @@ contains real, intent(in) :: dt real, intent(in) :: freq character(len=37), intent(in) :: decoded - character c1*12,c2*12,g2*4,w*4,ctmp*12 - integer i0,i1,i2,i3,i4,i5,i6,n30,nwrap + character c1*12,c2*12,g2*4,w*4 + integer i0,i1,i2,i3,i4,i5,n30,nwrap integer, intent(in) :: nap real, intent(in) :: qual character*2 annot diff --git a/lib/ft8/bpdecode174.f90 b/lib/ft8/bpdecode174.f90 deleted file mode 100644 index 9442cc4a1..000000000 --- a/lib/ft8/bpdecode174.f90 +++ /dev/null @@ -1,401 +0,0 @@ -subroutine bpdecode174(llr,apmask,maxiterations,decoded,cw,nharderror,iter) -! -! A log-domain belief propagation decoder for the (174,87) code. -! -integer, parameter:: N=174, K=87, M=N-K -integer*1 codeword(N),cw(N),apmask(N) -integer colorder(N) -integer*1 decoded(K) -integer Nm(7,M) ! 5, 6, or 7 bits per check -integer Mn(3,N) ! 3 checks per bit -integer synd(M) -real tov(3,N) -real toc(7,M) -real tanhtoc(7,M) -real zn(N) -real llr(N) -real Tmn -integer nrw(M) - -data colorder/ & - 0, 1, 2, 3, 30, 4, 5, 6, 7, 8, 9, 10, 11, 32, 12, 40, 13, 14, 15, 16,& - 17, 18, 37, 45, 29, 19, 20, 21, 41, 22, 42, 31, 33, 34, 44, 35, 47, 51, 50, 43,& - 36, 52, 63, 46, 25, 55, 27, 24, 23, 53, 39, 49, 59, 38, 48, 61, 60, 57, 28, 62,& - 56, 58, 65, 66, 26, 70, 64, 69, 68, 67, 74, 71, 54, 76, 72, 75, 78, 77, 80, 79,& - 73, 83, 84, 81, 82, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,& - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,& - 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,& - 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,& - 160,161,162,163,164,165,166,167,168,169,170,171,172,173/ - -data Mn/ & - 1, 25, 69, & - 2, 5, 73, & - 3, 32, 68, & - 4, 51, 61, & - 6, 63, 70, & - 7, 33, 79, & - 8, 50, 86, & - 9, 37, 43, & - 10, 41, 65, & - 11, 14, 64, & - 12, 75, 77, & - 13, 23, 81, & - 15, 16, 82, & - 17, 56, 66, & - 18, 53, 60, & - 19, 31, 52, & - 20, 67, 84, & - 21, 29, 72, & - 22, 24, 44, & - 26, 35, 76, & - 27, 36, 38, & - 28, 40, 42, & - 30, 54, 55, & - 34, 49, 87, & - 39, 57, 58, & - 45, 74, 83, & - 46, 62, 80, & - 47, 48, 85, & - 59, 71, 78, & - 1, 50, 53, & - 2, 47, 84, & - 3, 25, 79, & - 4, 6, 14, & - 5, 7, 80, & - 8, 34, 55, & - 9, 36, 69, & - 10, 43, 83, & - 11, 23, 74, & - 12, 17, 44, & - 13, 57, 76, & - 15, 27, 56, & - 16, 28, 29, & - 18, 19, 59, & - 20, 40, 63, & - 21, 35, 52, & - 22, 54, 64, & - 24, 62, 78, & - 26, 32, 77, & - 30, 72, 85, & - 31, 65, 87, & - 33, 39, 51, & - 37, 48, 75, & - 38, 70, 71, & - 41, 42, 68, & - 45, 67, 86, & - 46, 81, 82, & - 49, 66, 73, & - 58, 60, 66, & - 61, 65, 85, & - 1, 14, 21, & - 2, 13, 59, & - 3, 67, 82, & - 4, 32, 73, & - 5, 36, 54, & - 6, 43, 46, & - 7, 28, 75, & - 8, 33, 71, & - 9, 49, 76, & - 10, 58, 64, & - 11, 48, 68, & - 12, 19, 45, & - 15, 50, 61, & - 16, 22, 26, & - 17, 72, 80, & - 18, 40, 55, & - 20, 35, 51, & - 23, 25, 34, & - 24, 63, 87, & - 27, 39, 74, & - 29, 78, 83, & - 30, 70, 77, & - 31, 69, 84, & - 22, 37, 86, & - 38, 41, 81, & - 42, 44, 57, & - 47, 53, 62, & - 52, 56, 79, & - 60, 75, 81, & - 1, 39, 77, & - 2, 16, 41, & - 3, 31, 54, & - 4, 36, 78, & - 5, 45, 65, & - 6, 57, 85, & - 7, 14, 49, & - 8, 21, 46, & - 9, 15, 72, & - 10, 20, 62, & - 11, 17, 71, & - 12, 34, 47, & - 13, 68, 86, & - 18, 23, 43, & - 19, 64, 73, & - 24, 48, 79, & - 25, 70, 83, & - 26, 80, 87, & - 27, 32, 40, & - 28, 56, 69, & - 29, 63, 66, & - 30, 42, 50, & - 33, 37, 82, & - 35, 60, 74, & - 38, 55, 84, & - 44, 52, 61, & - 51, 53, 72, & - 58, 59, 67, & - 47, 56, 76, & - 1, 19, 37, & - 2, 61, 75, & - 3, 8, 66, & - 4, 60, 84, & - 5, 34, 39, & - 6, 26, 53, & - 7, 32, 57, & - 9, 52, 67, & - 10, 12, 15, & - 11, 51, 69, & - 13, 14, 65, & - 16, 31, 43, & - 17, 20, 36, & - 18, 80, 86, & - 21, 48, 59, & - 22, 40, 46, & - 23, 33, 62, & - 24, 30, 74, & - 25, 42, 64, & - 27, 49, 85, & - 28, 38, 73, & - 29, 44, 81, & - 35, 68, 70, & - 41, 63, 76, & - 45, 49, 71, & - 50, 58, 87, & - 48, 54, 83, & - 13, 55, 79, & - 77, 78, 82, & - 1, 2, 24, & - 3, 6, 75, & - 4, 56, 87, & - 5, 44, 53, & - 7, 50, 83, & - 8, 10, 28, & - 9, 55, 62, & - 11, 29, 67, & - 12, 33, 40, & - 14, 16, 20, & - 15, 35, 73, & - 17, 31, 39, & - 18, 36, 57, & - 19, 46, 76, & - 21, 42, 84, & - 22, 34, 59, & - 23, 26, 61, & - 25, 60, 65, & - 27, 64, 80, & - 30, 37, 66, & - 32, 45, 72, & - 38, 51, 86, & - 41, 77, 79, & - 43, 56, 68, & - 47, 74, 82, & - 40, 52, 78, & - 54, 61, 71, & - 46, 58, 69/ - -data Nm/ & - 1, 30, 60, 89, 118, 147, 0, & - 2, 31, 61, 90, 119, 147, 0, & - 3, 32, 62, 91, 120, 148, 0, & - 4, 33, 63, 92, 121, 149, 0, & - 2, 34, 64, 93, 122, 150, 0, & - 5, 33, 65, 94, 123, 148, 0, & - 6, 34, 66, 95, 124, 151, 0, & - 7, 35, 67, 96, 120, 152, 0, & - 8, 36, 68, 97, 125, 153, 0, & - 9, 37, 69, 98, 126, 152, 0, & - 10, 38, 70, 99, 127, 154, 0, & - 11, 39, 71, 100, 126, 155, 0, & - 12, 40, 61, 101, 128, 145, 0, & - 10, 33, 60, 95, 128, 156, 0, & - 13, 41, 72, 97, 126, 157, 0, & - 13, 42, 73, 90, 129, 156, 0, & - 14, 39, 74, 99, 130, 158, 0, & - 15, 43, 75, 102, 131, 159, 0, & - 16, 43, 71, 103, 118, 160, 0, & - 17, 44, 76, 98, 130, 156, 0, & - 18, 45, 60, 96, 132, 161, 0, & - 19, 46, 73, 83, 133, 162, 0, & - 12, 38, 77, 102, 134, 163, 0, & - 19, 47, 78, 104, 135, 147, 0, & - 1, 32, 77, 105, 136, 164, 0, & - 20, 48, 73, 106, 123, 163, 0, & - 21, 41, 79, 107, 137, 165, 0, & - 22, 42, 66, 108, 138, 152, 0, & - 18, 42, 80, 109, 139, 154, 0, & - 23, 49, 81, 110, 135, 166, 0, & - 16, 50, 82, 91, 129, 158, 0, & - 3, 48, 63, 107, 124, 167, 0, & - 6, 51, 67, 111, 134, 155, 0, & - 24, 35, 77, 100, 122, 162, 0, & - 20, 45, 76, 112, 140, 157, 0, & - 21, 36, 64, 92, 130, 159, 0, & - 8, 52, 83, 111, 118, 166, 0, & - 21, 53, 84, 113, 138, 168, 0, & - 25, 51, 79, 89, 122, 158, 0, & - 22, 44, 75, 107, 133, 155, 172, & - 9, 54, 84, 90, 141, 169, 0, & - 22, 54, 85, 110, 136, 161, 0, & - 8, 37, 65, 102, 129, 170, 0, & - 19, 39, 85, 114, 139, 150, 0, & - 26, 55, 71, 93, 142, 167, 0, & - 27, 56, 65, 96, 133, 160, 174, & - 28, 31, 86, 100, 117, 171, 0, & - 28, 52, 70, 104, 132, 144, 0, & - 24, 57, 68, 95, 137, 142, 0, & - 7, 30, 72, 110, 143, 151, 0, & - 4, 51, 76, 115, 127, 168, 0, & - 16, 45, 87, 114, 125, 172, 0, & - 15, 30, 86, 115, 123, 150, 0, & - 23, 46, 64, 91, 144, 173, 0, & - 23, 35, 75, 113, 145, 153, 0, & - 14, 41, 87, 108, 117, 149, 170, & - 25, 40, 85, 94, 124, 159, 0, & - 25, 58, 69, 116, 143, 174, 0, & - 29, 43, 61, 116, 132, 162, 0, & - 15, 58, 88, 112, 121, 164, 0, & - 4, 59, 72, 114, 119, 163, 173, & - 27, 47, 86, 98, 134, 153, 0, & - 5, 44, 78, 109, 141, 0, 0, & - 10, 46, 69, 103, 136, 165, 0, & - 9, 50, 59, 93, 128, 164, 0, & - 14, 57, 58, 109, 120, 166, 0, & - 17, 55, 62, 116, 125, 154, 0, & - 3, 54, 70, 101, 140, 170, 0, & - 1, 36, 82, 108, 127, 174, 0, & - 5, 53, 81, 105, 140, 0, 0, & - 29, 53, 67, 99, 142, 173, 0, & - 18, 49, 74, 97, 115, 167, 0, & - 2, 57, 63, 103, 138, 157, 0, & - 26, 38, 79, 112, 135, 171, 0, & - 11, 52, 66, 88, 119, 148, 0, & - 20, 40, 68, 117, 141, 160, 0, & - 11, 48, 81, 89, 146, 169, 0, & - 29, 47, 80, 92, 146, 172, 0, & - 6, 32, 87, 104, 145, 169, 0, & - 27, 34, 74, 106, 131, 165, 0, & - 12, 56, 84, 88, 139, 0, 0, & - 13, 56, 62, 111, 146, 171, 0, & - 26, 37, 80, 105, 144, 151, 0, & - 17, 31, 82, 113, 121, 161, 0, & - 28, 49, 59, 94, 137, 0, 0, & - 7, 55, 83, 101, 131, 168, 0, & - 24, 50, 78, 106, 143, 149, 0/ - -data nrw/ & - 6,6,6,6,6,6,6,6,6,6, & - 6,6,6,6,6,6,6,6,6,6, & - 6,6,6,6,6,6,6,6,6,6, & - 6,6,6,6,6,6,6,6,6,7, & - 6,6,6,6,6,7,6,6,6,6, & - 6,6,6,6,6,7,6,6,6,6, & - 7,6,5,6,6,6,6,6,6,5, & - 6,6,6,6,6,6,6,6,6,6, & - 5,6,6,6,5,6,6/ - -ncw=3 - -decoded=0 -toc=0 -tov=0 -tanhtoc=0 -! initialize messages to checks -do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo -enddo - -ncnt=0 - -do iter=0,maxiterations - -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it - codeword=cw(colorder+1) - decoded=codeword(M+1:N) - nerr=0 - do i=1,N - if( (2*cw(i)-1)*llr(i) .lt. 0.0 ) nerr=nerr+1 - enddo - nharderror=nerr - return - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:7,i)=tanh(-toc(1:7,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - -enddo -nharderror=-1 -return -end subroutine bpdecode174 diff --git a/lib/ft8/chkcrc12a.f90 b/lib/ft8/chkcrc12a.f90 deleted file mode 100644 index fc4291907..000000000 --- a/lib/ft8/chkcrc12a.f90 +++ /dev/null @@ -1,24 +0,0 @@ -subroutine chkcrc12a(decoded,nbadcrc) - - use crc - integer*1 decoded(87) - integer*1, target:: i1Dec8BitBytes(11) - character*87 cbits - -! Write decoded bits into cbits: 75-bit message plus 12-bit CRC - write(cbits,1000) decoded -1000 format(87i1) - read(cbits,1001) i1Dec8BitBytes -1001 format(11b8) - read(cbits,1002) ncrc12 !Received CRC12 -1002 format(75x,b12) - - i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),128+64+32) - i1Dec8BitBytes(11)=0 - icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits - - nbadcrc=1 - if(ncrc12.eq.icrc12) nbadcrc=0 - - return -end subroutine chkcrc12a diff --git a/lib/ft8/foxgen.f90 b/lib/ft8/foxgen.f90 index 806b20648..7492a6f70 100644 --- a/lib/ft8/foxgen.f90 +++ b/lib/ft8/foxgen.f90 @@ -20,7 +20,6 @@ subroutine foxgen() character*37 msg,msgsent integer itone(79) integer*1 msgbits(77),msgbits2 - integer*1, target:: i1Msg8BitBytes(11) integer*1, target:: mycall real x(NFFT) real*8 dt,twopi,f0,fstep,dfreq,phi,dphi diff --git a/lib/ft8/ft8apset.f90 b/lib/ft8/ft8apset.f90 index 2fac41969..15eddd057 100644 --- a/lib/ft8/ft8apset.f90 +++ b/lib/ft8/ft8apset.f90 @@ -4,7 +4,6 @@ subroutine ft8apset(mycall12,hiscall12,apsym) character*37 msg character*12 mycall12,hiscall12,hiscall integer apsym(58) - integer*1 msgbits(77) logical nohiscall if(len(trim(mycall12)).eq.0) then diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 0f075aad2..5db48341a 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -7,12 +7,10 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & use packjt77 include 'ft8_params.f90' parameter(NP2=2812) - character*37 msg37,msgsent37 + character*37 msg37 character*12 mycall12,hiscall12,hiscall12_0 character*77 c77 - character*6 mycall6,hiscall6,c1,c2 character*13 c13 - character*87 cbits real a(5) real s8(0:7,NN) real s2(0:511),s2l(0:511) @@ -28,7 +26,6 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & integer nappasses(0:5) !Number of decoding passes to use for each QSO state integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now integer ncontest,ncontest0 - integer*1, target:: i1hiscall(12) logical one(0:511,0:8) integer graymap(0:7) complex cd0(0:3199) diff --git a/lib/ft8/ft8code.f90 b/lib/ft8/ft8code.f90 index c20aaaa38..cbafd34be 100644 --- a/lib/ft8/ft8code.f90 +++ b/lib/ft8/ft8code.f90 @@ -8,14 +8,11 @@ program ft8code include 'ft8_testmsg.f90' parameter (NWAVE=NN*NSPS) - character*77 c77 character*37 msg,msgsent character*9 comment - character bad*1,msgtype*16 - character*91 cbits + character bad*1,msgtype*18 integer itone(NN) integer*1 msgbits(77) - logical unpk77_success ! Get command-line argument(s) nargs=iargc() @@ -69,10 +66,10 @@ program ft8code if(msg.ne.msgsent) bad="*" if(n3.ge.0) then write(*,1020) imsg,msg,msgsent,bad,i3,n3,msgtype,comment -1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a16,1x,a9) +1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a18,1x,a9) else write(*,1022) imsg,msg,msgsent,bad,i3,msgtype,comment -1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a16,1x,a9) +1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a18,1x,a9) endif enddo diff --git a/lib/ft8/ft8sim.f90 b/lib/ft8/ft8sim.f90 index a1de4061f..e43850daf 100644 --- a/lib/ft8/ft8sim.f90 +++ b/lib/ft8/ft8sim.f90 @@ -9,7 +9,7 @@ program ft8sim parameter (NWAVE=NN*NSPS) type(hdr) h !Header for .wav file character arg*12,fname*17 - character msg37*37,msgsent37*37,msg40*40 + character msg37*37,msgsent37*37 character c77*77 complex c0(0:NMAX-1) complex c(0:NMAX-1) diff --git a/lib/msk144code.f90 b/lib/msk144code.f90 index 6c8963d01..81a185159 100644 --- a/lib/msk144code.f90 +++ b/lib/msk144code.f90 @@ -5,7 +5,7 @@ program msk144code use packjt77 character*77 c77 - character msg*37,msgsent*37,decoded,bad*1,msgtype*16 + character msg*37,msgsent*37,decoded,bad*1,msgtype*18 integer*4 i4tone(144) include 'msk144_testmsg.f90' @@ -61,13 +61,13 @@ program msk144code if(msg.ne.msgsent) bad="*" if(i3.eq.0.and.n3.ge.0) then write(*,1020) imsg,msg,msgsent,bad,i3,n3,msgtype -1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a16) +1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a18) elseif(i3.ge.1) then write(*,1022) imsg,msg,msgsent,bad,i3,msgtype -1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a16) +1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a18) elseif(i3.lt.0) then write(*,1024) imsg,msg,msgsent,bad,msgtype -1024 format(i2,'.',1x,a37,1x,a37,1x,a1,6x,a16) +1024 format(i2,'.',1x,a37,1x,a37,1x,a1,6x,a18) endif enddo diff --git a/lib/msk144decodeframe.f90 b/lib/msk144decodeframe.f90 index de039aadc..19da84937 100644 --- a/lib/msk144decodeframe.f90 +++ b/lib/msk144decodeframe.f90 @@ -100,7 +100,7 @@ subroutine msk144decodeframe(c,softbits,msgreceived,nsuccess) if( nharderror .ge. 0 .and. nharderror .lt. 18 ) then nsuccess=1 write(c77,'(77i1)') decoded77 - read(c77(72:77),'(2b3)'),n3,i3 + read(c77(72:77),'(2b3)') n3,i3 if( (i3.eq.0.and.(n3.eq.1 .or. n3.eq.3 .or. n3.eq.4 .or. n3.gt.5)) .or. i3.eq.3 .or. i3.gt.4 ) then nsuccess=0 else diff --git a/lib/msk144sim.f90 b/lib/msk144sim.f90 index 7b2a8a00b..3472d8827 100644 --- a/lib/msk144sim.f90 +++ b/lib/msk144sim.f90 @@ -5,7 +5,6 @@ program msk144sim real pings(0:NMAX-1) real waveform(0:NMAX-1) character arg*8,msg*37,msgsent*37,fname*40 - character*77 c77 real wave(0:NMAX-1) !Simulated received waveform real*8 twopi,freq,phi,dphi0,dphi1,dphi type(hdr) h !Header for .wav file