From 2da8f51fc288380a03109977ec6c9a8c88fa2cc4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 29 Jun 2018 12:02:29 -0400 Subject: [PATCH] Fix bugs for a few edge-case messages. Add some test files. --- lib/77bit/77bit.txt | 15 +++--- lib/77bit/encode77.f90 | 19 ++++--- lib/77bit/encode77.out | 41 +++++++++++++++ lib/77bit/messages.txt | 107 ++++++++++++++++++++++----------------- lib/77bit/messages_2.txt | 49 ++++++++++++++++++ lib/77bit/pack77_1.f90 | 33 +++++++++--- lib/77bit/unpack77.f90 | 6 +-- 7 files changed, 199 insertions(+), 71 deletions(-) create mode 100644 lib/77bit/encode77.out create mode 100644 lib/77bit/messages_2.txt diff --git a/lib/77bit/77bit.txt b/lib/77bit/77bit.txt index aa8652514..727f614a6 100644 --- a/lib/77bit/77bit.txt +++ b/lib/77bit/77bit.txt @@ -19,7 +19,7 @@ i3.n3 Example message Bits Total Purpose 1 WA9XYZ/R KA1ABC/R R FN42 28 1 28 1 1 15 74 Standard msg 2 PA3XYZ/P GM4ABC/P R JO22 28 1 28 1 1 15 74 EU VHF contest -3 TU; W9XYZ K1ABC R 579 MA 1 28 28 1 3 13 74 ARRL RTTY contest +3 TU; W9XYZ K1ABC R 579 MA 1 28 28 1 3 13 74 ARRL RTTY Roundup 4 PJ4/KA1ABC RR73 12 58 1 2 1 74 Nonstandard calls 5 6 @@ -57,19 +57,21 @@ i3.n3 0.4 ARRL Field Day exchange (17-32 transmitters). +0.5 Telemetry, 71 bits + 1. Two standard callsigns, Roger, and grid or report. Each callsign may have an appended "/R" to indicate Rover status for NA VHF contests. -2. Standard message for ARRL RTTY Roundup. Optional "TU;" at +2. Same as Type 1, but uses /P instead of /R. For European VHF contests. + +3. Standard message for ARRL RTTY Roundup. Optional "TU;" at beginning to finish a previous QSO; then two standard callsigns, optional "R", a 3-bit report (529 to 599), and 13 bits to indicate US state, Canadian province/territory, or DX serial number. -3. Same as Type 1, but uses /P instead of /R. For European VHF contests. - -4. One nonstandard call with up to 11 characters, one hashed call, - followed by , RRR, RR73, or 73. +4. One hashed call; one standard, compound, or nonstandard call with + up to 11 characters; and an optional RRR, RR73, or 73. --------------------------------------------------------------------------- The following are tentative: not to be included in first release. @@ -78,4 +80,3 @@ The following are tentative: not to be included in first release. DX: RST + CQzone R 559 15 R1 r3 z6 6. CQ WPX RTTY - RST + serial R 589 0013 R1 r3 n12 - diff --git a/lib/77bit/encode77.f90 b/lib/77bit/encode77.f90 index a6aacf38e..212ec67e2 100644 --- a/lib/77bit/encode77.f90 +++ b/lib/77bit/encode77.f90 @@ -1,6 +1,7 @@ program encode77 - character msg*37,msg0*37,cerr*1 + character*80 msg0 + character msg*37,cerr*1 character*77 c77 nargs=iargc() @@ -14,16 +15,20 @@ program encode77 1000 format('i3.n3 Err Message to be encoded Decoded message'/ & 80('-')) read(10,1002,end=999) msg0 -1002 format(a37) +1002 format(a80) endif - if(msg0.eq.' ') exit - call pack77(msg0,i3,n3,c77) + if(msg0(1:1).eq.'$') exit + if(msg0.eq.' ') cycle + if(msg0(2:2).eq.'.' .or. msg0(3:3).eq.'.') cycle + if(msg0(1:3).eq.'---') cycle + msg0=adjustl(msg0) + call pack77(msg0(1:37),i3,n3,c77) call unpack77(c77,msg) cerr=' ' - if(msg.ne.msg0) cerr='*' - if(i3.eq.0) write(*,1004) i3,n3,cerr,msg0,msg + if(msg.ne.msg0(1:37)) cerr='*' + if(i3.eq.0) write(*,1004) i3,n3,cerr,msg0(1:37),msg 1004 format(i2,'.',i1,2x,a1,3x,a37,1x,a37) - if(i3.ge.1) write(*,1005) i3,cerr,msg0,msg + if(i3.ge.1) write(*,1005) i3,cerr,msg0(1:37),msg 1005 format(i2,'.',3x,a1,3x,a37,1x,a37) if(nargs.eq.1) exit enddo diff --git a/lib/77bit/encode77.out b/lib/77bit/encode77.out new file mode 100644 index 000000000..2d0f7d4c5 --- /dev/null +++ b/lib/77bit/encode77.out @@ -0,0 +1,41 @@ +i3.n3 Err Message to be encoded Decoded message +-------------------------------------------------------------------------------- + 1. CQ K1ABC FN42 CQ K1ABC FN42 + 1. K1ABC W9XYZ EN37 K1ABC W9XYZ EN37 + 1. W9XYZ K1ABC -11 W9XYZ K1ABC -11 + 1. K1ABC W9XYZ R-09 K1ABC W9XYZ R-09 + 1. W9XYZ K1ABC RRR W9XYZ K1ABC RRR + 1. K1ABC W9XYZ 73 K1ABC W9XYZ 73 + 1. CQ K1ABC FN42 CQ K1ABC FN42 + 1. K1ABC W9XYZ -09 K1ABC W9XYZ -09 + 1. W9XYZ K1ABC R-11 W9XYZ K1ABC R-11 + 1. K1ABC W9XYZ RR73 K1ABC W9XYZ RR73 + 1. W9XYZ K1ABC 73 W9XYZ K1ABC 73 + 4. CQ KH1/KH7Z CQ KH1/KH7Z + 1. KH7Z K1ABC FN42 KH7Z K1ABC FN42 + 1. K1ABC KH7Z -12 K1ABC KH7Z -12 + 1. KH7Z K1ABC R-14 KH7Z K1ABC R-14 + 0.1 K1ABC RR73; W9XYZ -08 K1ABC RR73; W9XYZ -08 + 1. CQ FD K1ABC FN42 CQ FD K1ABC FN42 + 0.3 K1ABC W9XYZ 6A WI K1ABC W9XYZ 6A WI + 0.3 W9XYZ K1ABC R 2B EMA W9XYZ K1ABC R 2B EMA + 1. K1ABC W9XYZ RR73 K1ABC W9XYZ RR73 + 1. CQ TEST K1ABC/R FN42 CQ TEST K1ABC/R FN42 + 1. K1ABC/R W9XYZ EN37 K1ABC/R W9XYZ EN37 + 1. W9XYZ K1ABC/R R FN42 W9XYZ K1ABC/R R FN42 + 1. K1ABC/R W9XYZ RR73 K1ABC/R W9XYZ RR73 + 1. CQ TEST K1ABC FN42 CQ TEST K1ABC FN42 + 3. K1ABC W9XYZ 579 WI K1ABC W9XYZ 579 WI + 3. W9XYZ K1ABC R 589 MA W9XYZ K1ABC R 589 MA + 1. K1ABC W9XYZ RR73 K1ABC W9XYZ RR73 + 2. CQ G4ABC/P IO91 CQ G4ABC/P IO91 + 2. G4ABC/P PA9XYZ JO22 G4ABC/P PA9XYZ JO22 + 0.2 PA9XYZ 590003 IO91NP PA9XYZ 590003 IO91NP + 0.2 G4ABC/P R 570007 JO22DB G4ABC/P R 570007 JO22DB + 2. PA9XYZ G4ABC/P RR73 PA9XYZ G4ABC/P RR73 + 4. CQ PJ4/K1ABC CQ PJ4/K1ABC + 4. W9XYZ W9XYZ + 1. W9XYZ K1ABC -11 W9XYZ K1ABC -11 + 1. K1ABC W9XYZ R-09 K1ABC W9XYZ R-09 + 4. W9XYZ RRR W9XYZ RRR + 4. W9XYZ 73 W9XYZ 73 diff --git a/lib/77bit/messages.txt b/lib/77bit/messages.txt index 38399e694..bdae86b66 100644 --- a/lib/77bit/messages.txt +++ b/lib/77bit/messages.txt @@ -1,49 +1,62 @@ -FREE TEXT MSG 71 0 71 -CQ YW18FIFA -K1ABC RR73; W9XYZ -12 28 28 10 5 1 71 DXpedition Mode -PA3XYZ/P R 590003 IO91NP 28 1 1 3 12 25 2 70 EU VHF contest (2) -PA3XYZ 520093 IO91NP 28 1 1 3 12 25 2 70 EU VHF contest (2) -WA9XYZ KA1ABC R 16A EMA 28 28 1 4 3 7 3 71 ARRL Field Day -WA9XYZ KA1ABC 7D EMA 28 28 1 4 3 7 3 71 ARRL Field Day -WA9XYZ G8ABC 1D DX 28 28 1 4 3 7 3 71 ARRL Field Day -WA9XYZ KA1ABC R 32A EMA 28 28 1 4 3 7 4 71 ARRL Field Day -123456789ABCDEF012 71 71 Telemetry (18 hex) -71234567 71 71 Telemetry (18 hex) -81234567 71 71 Telemetry (18 hex) -7123456789ABCDEF01 71 71 Telemetry (18 hex) -8123456789ABCDEF01 71 71 Telemetry (18 hex) -WA9XYZ/R KA1ABC/R R FN42 28 1 28 1 1 15 74 Standard msg -WA9XYZ KA1ABC R-19 28 1 28 1 1 15 74 Standard msg -WA9XYZ KA1ABC +03 28 1 28 1 1 15 74 Standard msg -WA9XYZ KA1ABC -30 28 1 28 1 1 15 74 Standard msg -WA9XYZ KA1ABC +30 28 1 28 1 1 15 74 Standard msg +1. Standard QSO +----------------------------------------------------------- CQ K1ABC FN42 -DE K1ABC FN42 -QRZ K1ABC FN42 -CQ AA K1ABC FN42 -CQ ZZ K1ABC FN42 -CQ 000 K1ABC FN42 -CQ 313 K1ABC FN42 -CQ 999 K1ABC FN42 -CQ AAA K1ABC FN42 -CQ ZZZ K1ABC FN42 -CQ AAAA K1ABC FN42 -CQ ZZZZ K1ABC FN42 + K1ABC W9XYZ EN37 +W9XYZ K1ABC -11 + K1ABC W9XYZ R-09 +W9XYZ K1ABC RRR + K1ABC W9XYZ 73 + +2. Short-cycle QSO +----------------------------------------------------------- +CQ K1ABC FN42 + K1ABC W9XYZ -09 +W9XYZ K1ABC R-11 + K1ABC W9XYZ RR73 +W9XYZ K1ABC 73 + +3. FT8 DXpedition Mode +----------------------------------------------------------- CQ KH1/KH7Z -CQ YW18FIFA -CQ W4/YW18FIFA -PA1XYZ/P GM4ABC/P R FN42 28 1 28 1 1 15 74 EU VHF Contest -TU; W9XYZ K1ABC R 579 MA 1 28 28 1 3 13 74 ARRL RTTY contest -TU; W9XYZ G8ABC R 559 0013 1 28 28 1 3 13 74 ARRL RTTY (DX) -W9XYZ K1ABC 519 MA 1 28 28 1 3 13 74 ARRL RTTY contest -W9XYZ K1ABC 529 MA 1 28 28 1 3 13 74 ARRL RTTY contest -W9XYZ K1ABC 599 MA 1 28 28 1 3 13 74 ARRL RTTY contest -W9XYZ K1ABC 599 SNJ 1 28 28 1 3 13 74 ARRL RTTY contest -W9XYZ G8ABC 529 0013 1 28 28 1 3 13 74 ARRL RTTY (DX) -W9XYZ G8ABC 599 0013 1 28 28 1 3 13 74 ARRL RTTY (DX) - PJ4/KA1ABC 13 58 1 2 74 Nonstandard call -PJ4/KA1ABC RRR 13 58 1 2 74 Nonstandard call - PJ4/KA1ABC RR73 13 58 1 2 74 Nonstandard call -PJ4/KA1ABC 73 13 58 1 2 74 Nonstandard call - PJ4/KA1ABC 73 13 58 1 2 74 Nonstandard call -CQ 313 YW18FIFA + KH7Z K1ABC FN42 +K1ABC KH7Z -12 + KH7Z K1ABC R-14 +K1ABC RR73; W9XYZ -08 + +4. ARRL Field Day +----------------------------------------------------------- +CQ FD K1ABC FN42 + K1ABC W9XYZ 6A WI +W9XYZ K1ABC R 2B EMA + K1ABC W9XYZ RR73 + +5. ARRL VHF Contests +----------------------------------------------------------- +CQ TEST K1ABC/R FN42 + K1ABC/R W9XYZ EN37 +W9XYZ K1ABC/R R FN42 + K1ABC/R W9XYZ RR73 + +6. ARRL RTTY Contest +----------------------------------------------------------- +CQ TEST K1ABC FN42 + K1ABC W9XYZ 579 WI +W9XYZ K1ABC R 589 MA + K1ABC W9XYZ RR73 + +7. EU VHF Contest +----------------------------------------------------------- +CQ G4ABC/P IO91 + G4ABC/P PA9XYZ JO22 +PA9XYZ 590003 IO91NP + G4ABC/P R 570007 JO22DB +PA9XYZ G4ABC/P RR73 + +8. Compound or goofy calls +----------------------------------------------------------- +CQ PJ4/K1ABC + W9XYZ +W9XYZ K1ABC -11 + K1ABC W9XYZ R-09 +W9XYZ RRR + W9XYZ 73 diff --git a/lib/77bit/messages_2.txt b/lib/77bit/messages_2.txt new file mode 100644 index 000000000..38399e694 --- /dev/null +++ b/lib/77bit/messages_2.txt @@ -0,0 +1,49 @@ +FREE TEXT MSG 71 0 71 +CQ YW18FIFA +K1ABC RR73; W9XYZ -12 28 28 10 5 1 71 DXpedition Mode +PA3XYZ/P R 590003 IO91NP 28 1 1 3 12 25 2 70 EU VHF contest (2) +PA3XYZ 520093 IO91NP 28 1 1 3 12 25 2 70 EU VHF contest (2) +WA9XYZ KA1ABC R 16A EMA 28 28 1 4 3 7 3 71 ARRL Field Day +WA9XYZ KA1ABC 7D EMA 28 28 1 4 3 7 3 71 ARRL Field Day +WA9XYZ G8ABC 1D DX 28 28 1 4 3 7 3 71 ARRL Field Day +WA9XYZ KA1ABC R 32A EMA 28 28 1 4 3 7 4 71 ARRL Field Day +123456789ABCDEF012 71 71 Telemetry (18 hex) +71234567 71 71 Telemetry (18 hex) +81234567 71 71 Telemetry (18 hex) +7123456789ABCDEF01 71 71 Telemetry (18 hex) +8123456789ABCDEF01 71 71 Telemetry (18 hex) +WA9XYZ/R KA1ABC/R R FN42 28 1 28 1 1 15 74 Standard msg +WA9XYZ KA1ABC R-19 28 1 28 1 1 15 74 Standard msg +WA9XYZ KA1ABC +03 28 1 28 1 1 15 74 Standard msg +WA9XYZ KA1ABC -30 28 1 28 1 1 15 74 Standard msg +WA9XYZ KA1ABC +30 28 1 28 1 1 15 74 Standard msg +CQ K1ABC FN42 +DE K1ABC FN42 +QRZ K1ABC FN42 +CQ AA K1ABC FN42 +CQ ZZ K1ABC FN42 +CQ 000 K1ABC FN42 +CQ 313 K1ABC FN42 +CQ 999 K1ABC FN42 +CQ AAA K1ABC FN42 +CQ ZZZ K1ABC FN42 +CQ AAAA K1ABC FN42 +CQ ZZZZ K1ABC FN42 +CQ KH1/KH7Z +CQ YW18FIFA +CQ W4/YW18FIFA +PA1XYZ/P GM4ABC/P R FN42 28 1 28 1 1 15 74 EU VHF Contest +TU; W9XYZ K1ABC R 579 MA 1 28 28 1 3 13 74 ARRL RTTY contest +TU; W9XYZ G8ABC R 559 0013 1 28 28 1 3 13 74 ARRL RTTY (DX) +W9XYZ K1ABC 519 MA 1 28 28 1 3 13 74 ARRL RTTY contest +W9XYZ K1ABC 529 MA 1 28 28 1 3 13 74 ARRL RTTY contest +W9XYZ K1ABC 599 MA 1 28 28 1 3 13 74 ARRL RTTY contest +W9XYZ K1ABC 599 SNJ 1 28 28 1 3 13 74 ARRL RTTY contest +W9XYZ G8ABC 529 0013 1 28 28 1 3 13 74 ARRL RTTY (DX) +W9XYZ G8ABC 599 0013 1 28 28 1 3 13 74 ARRL RTTY (DX) + PJ4/KA1ABC 13 58 1 2 74 Nonstandard call +PJ4/KA1ABC RRR 13 58 1 2 74 Nonstandard call + PJ4/KA1ABC RR73 13 58 1 2 74 Nonstandard call +PJ4/KA1ABC 73 13 58 1 2 74 Nonstandard call + PJ4/KA1ABC 73 13 58 1 2 74 Nonstandard call +CQ 313 YW18FIFA diff --git a/lib/77bit/pack77_1.f90 b/lib/77bit/pack77_1.f90 index 89ce44b5d..9ef8fa710 100644 --- a/lib/77bit/pack77_1.f90 +++ b/lib/77bit/pack77_1.f90 @@ -15,28 +15,44 @@ subroutine pack77_1(nwords,w,i3,n3,c77) grid4(3:3).ge.'0' .and. grid4(3:3).le.'9' .and. & grid4(4:4).ge.'0' .and. grid4(4:4).le.'9' - if(nwords.lt.3 .or. nwords.gt.4) return + if(nwords.lt.2 .or. nwords.gt.4) return call chkcall(w(1),bcall_1,ok1) call chkcall(w(2),bcall_2,ok2) if(w(1)(1:3).eq.'DE ' .or. w(1)(1:3).eq.'CQ_' .or. w(1)(1:3).eq.'CQ ' .or. & w(1)(1:4).eq.'QRZ ') ok1=.true. if(.not.ok1 .or. .not.ok2) return + if(nwords.eq.2 .and. (.not.ok2 .or. index(w(2),'/').ge.2)) return + if(nwords.eq.2) go to 10 + c1=w(nwords)(1:1) c2=w(nwords)(1:2) - if(.not.is_grid4(w(nwords)(1:4)) .and. c1.ne.'+' .and. c1.ne.'-' & - .and. c2.ne.'R+' .and. c2.ne.'R-') return + if(.not.is_grid4(w(nwords)(1:4)) .and. c1.ne.'+' .and. c1.ne.'-' & + .and. c2.ne.'R+' .and. c2.ne.'R-' .and. trim(w(nwords)).ne.'RRR' .and. & + trim(w(nwords)).ne.'RR73' .and. trim(w(nwords)).ne.'73') return if(c1.eq.'+' .or. c1.eq.'-') then ir=0 read(w(nwords),*) irpt + irpt=irpt+35 else if(c2.eq.'R+' .or. c2.eq.'R-') then ir=1 read(w(nwords)(2:),*) irpt + irpt=irpt+35 + else if(trim(w(nwords)).eq.'RRR') then + ir=0 + irpt=2 + else if(trim(w(nwords)).eq.'RR73') then + ir=0 + irpt=3 + else if(trim(w(nwords)).eq.'73') then + ir=0 + irpt=4 endif ! 1 WA9XYZ/R KA1ABC/R R FN42 28 1 28 1 1 15 74 Standard msg ! 2 PA3XYZ/P GM4ABC/P R JO22 28 1 28 1 1 15 74 EU VHF contest - if(nwords.eq.3 .or. (nwords.eq.4 .and. w(3)(1:2).eq.'R ')) then +10 if(nwords.eq.2 .or. nwords.eq.3 .or. (nwords.eq.4 .and. & + w(3)(1:2).eq.'R ')) then n3=0 i3=1 !Type 1: Standard message, possibly with "/R" if(index(w(1),'/P').ge.4 .or. index(w(2),'/P').ge.4) i3=2 !Type 2, with "/P" @@ -61,12 +77,15 @@ subroutine pack77_1(nwords,w,i3,n3,c77) j4=(ichar(grid4(4:4))-ichar('0')) igrid4=j1+j2+j3+j4 else - igrid4=MAXGRID4 + 35 + irpt + igrid4=MAXGRID4 + irpt + endif + if(nwords.eq.2) then + ir=0 + irpt=1 + igrid4=MAXGRID4+irpt endif write(c77,1000) n28a,ipa,n28b,ipb,ir,igrid4,i3 1000 format(2(b28.28,b1),b1,b15.15,b3.3) -! print*,igrid4 -! print*,c77 return end subroutine pack77_1 diff --git a/lib/77bit/unpack77.f90 b/lib/77bit/unpack77.f90 index 9c6bb9a27..7b3618e66 100644 --- a/lib/77bit/unpack77.f90 +++ b/lib/77bit/unpack77.f90 @@ -120,8 +120,7 @@ subroutine unpack77(c77,msg) msg=adjustl(msg) else if(i3.eq.1 .or. i3.eq.2) then -! Standard message (Type 1) or "/P" form of standard message for EU VHF contest (Type 2) - !### Here and elsewhere, must enable rpt/RRR/RR73/73 in igrid4 +! Type 1 (standard message) or Type 2 ("/P" form for EU VHF contest) read(c77,1000) n28a,ipa,n28b,ipb,ir,igrid4,i3 1000 format(2(b28,b1),b1,b15,b3) call unpack28(n28a,call_1) @@ -130,6 +129,7 @@ subroutine unpack77(c77,msg) i=index(call_1,' ') if(i.ge.4 .and. ipa.eq.1 .and. i3.eq.1) call_1(i:i+1)='/R' if(i.ge.4 .and. ipa.eq.1 .and. i3.eq.2) call_1(i:i+1)='/P' + i=index(call_2,' ') if(i.ge.4 .and. ipb.eq.1 .and. i3.eq.1) call_2(i:i+1)='/R' if(i.ge.4 .and. ipb.eq.1 .and. i3.eq.2) call_2(i:i+1)='/P' @@ -151,7 +151,7 @@ subroutine unpack77(c77,msg) irpt=igrid4-MAXGRID4 if(irpt.eq.1) msg=trim(call_1)//' '//trim(call_2) if(irpt.eq.2) msg=trim(call_1)//' '//trim(call_2)//' RRR' - if(irpt.eq.2) msg=trim(call_1)//' '//trim(call_2)//' RR73' + if(irpt.eq.3) msg=trim(call_1)//' '//trim(call_2)//' RR73' if(irpt.eq.4) msg=trim(call_1)//' '//trim(call_2)//' 73' if(irpt.ge.5) then write(crpt,'(i3.2)') irpt-35