| 
									
										
										
										
											2018-03-05 14:49:51 -05:00
										 |  |  | program ft8code
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Provides examples of message packing, LDPC(144,87) encoding, bit and
 | 
					
						
							|  |  |  | ! symbol ordering, and other details of the FT8 protocol.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   use packjt
 | 
					
						
							|  |  |  |   use crc
 | 
					
						
							|  |  |  |   include 'ft8_params.f90'               !Set various constants
 | 
					
						
							|  |  |  |   include 'ft8_testmsg.f90'
 | 
					
						
							|  |  |  |   parameter (NWAVE=NN*NSPS)
 | 
					
						
							|  |  |  |   
 | 
					
						
							|  |  |  |   character*40 msg,msgchk
 | 
					
						
							|  |  |  |   character*37 msg37
 | 
					
						
							|  |  |  |   character*6 c1,c2
 | 
					
						
							|  |  |  |   character*9 comment
 | 
					
						
							|  |  |  |   character*22 msgsent,message
 | 
					
						
							|  |  |  |   character*6 mygrid6
 | 
					
						
							|  |  |  |   character bad*1,msgtype*10
 | 
					
						
							|  |  |  |   character*87 cbits
 | 
					
						
							|  |  |  |   logical bcontest
 | 
					
						
							|  |  |  |   integer itone(NN)
 | 
					
						
							|  |  |  |   integer dgen(12)
 | 
					
						
							|  |  |  |   integer*1 msgbits(KK),decoded(KK),decoded0(KK)
 | 
					
						
							|  |  |  |   data mygrid6/'EM48  '/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Get command-line argument(s)
 | 
					
						
							|  |  |  |   nargs=iargc()
 | 
					
						
							|  |  |  |   if(nargs.ne.1 .and. nargs.ne.3) then
 | 
					
						
							|  |  |  |      print*
 | 
					
						
							|  |  |  |      print*,'Program ft8code:  Provides examples of message packing, ',       &
 | 
					
						
							|  |  |  |           'LDPC(174,87) encoding,'
 | 
					
						
							|  |  |  |      print*,'bit and symbol ordering, and other details of the FT8 protocol.'
 | 
					
						
							|  |  |  |      print*
 | 
					
						
							|  |  |  |      print*,'Usage: ft8code [-c grid] "message"  # Results for specified message'
 | 
					
						
							|  |  |  |      print*,'       ft8code -t                   # Examples of all message types'
 | 
					
						
							|  |  |  |      go to 999
 | 
					
						
							|  |  |  |   endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bcontest=.false.
 | 
					
						
							|  |  |  |   call getarg(1,msg)                    !Message to be transmitted
 | 
					
						
							|  |  |  |   if(len(trim(msg)).eq.2 .and. msg(1:2).eq.'-t') then
 | 
					
						
							|  |  |  |      testmsg(NTEST+1)='KA1ABC RR73; WB9XYZ <KH1/KH7Z> -11'
 | 
					
						
							|  |  |  |      nmsg=NTEST+1
 | 
					
						
							|  |  |  |   else if(len(trim(msg)).eq.2 .and. msg(1:2).eq.'-c') then
 | 
					
						
							|  |  |  |      bcontest=.true.
 | 
					
						
							|  |  |  |      call getarg(2,mygrid6)
 | 
					
						
							|  |  |  |      call getarg(3,msg)
 | 
					
						
							|  |  |  |      msgchk=msg
 | 
					
						
							|  |  |  |      nmsg=1
 | 
					
						
							|  |  |  |   else
 | 
					
						
							|  |  |  |      msgchk=msg
 | 
					
						
							|  |  |  |      call fmtmsg(msgchk,iz)          !To upper case; collapse multiple blanks
 | 
					
						
							|  |  |  |      nmsg=1
 | 
					
						
							|  |  |  |   endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   write(*,1010)
 | 
					
						
							|  |  |  | 1010 format("    Message                Decoded              Err? Type"/76("-"))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   do imsg=1,nmsg
 | 
					
						
							|  |  |  |      if(nmsg.gt.1) msg=testmsg(imsg)
 | 
					
						
							|  |  |  |      call fmtmsg(msg,iz)               !To upper case, collapse multiple blanks
 | 
					
						
							|  |  |  |      msgchk=msg
 | 
					
						
							|  |  |  |      
 | 
					
						
							|  |  |  | ! Generate msgsent, msgbits, and itone
 | 
					
						
							| 
									
										
										
										
											2018-08-11 18:05:36 -04:00
										 |  |  |      call packmsg(msg(1:22),dgen,itype,bcontest)
 | 
					
						
							|  |  |  |      msgtype=""
 | 
					
						
							|  |  |  |      if(itype.eq.1) msgtype="Std Msg"
 | 
					
						
							|  |  |  |      if(itype.eq.2) msgtype="Type 1 pfx"
 | 
					
						
							|  |  |  |      if(itype.eq.3) msgtype="Type 1 sfx"
 | 
					
						
							|  |  |  |      if(itype.eq.4) msgtype="Type 2 pfx"
 | 
					
						
							|  |  |  |      if(itype.eq.5) msgtype="Type 2 sfx"
 | 
					
						
							|  |  |  |      if(itype.eq.6) msgtype="Free text"
 | 
					
						
							|  |  |  |      i3bit=0
 | 
					
						
							|  |  |  |      call genft8(msg(1:22),mygrid6,bcontest,i3bit,msgsent,msgbits,itone)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-05 14:49:51 -05:00
										 |  |  |      decoded=msgbits
 | 
					
						
							|  |  |  |      i3bit=4*decoded(73) + 2*decoded(74) + decoded(75)
 | 
					
						
							|  |  |  |      iFreeText=decoded(57)
 | 
					
						
							|  |  |  |      decoded0=decoded
 | 
					
						
							|  |  |  |      if(i3bit.eq.1) decoded(57:)=0
 | 
					
						
							|  |  |  |      call extractmessage174(decoded,message,ncrcflag)
 | 
					
						
							|  |  |  |      decoded=decoded0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-11 18:05:36 -04:00
										 |  |  |     if(bcontest) call fix_contest_msg(mygrid6,message)
 | 
					
						
							|  |  |  |     bad=" "
 | 
					
						
							|  |  |  |     comment='         '
 | 
					
						
							|  |  |  |     if(itype.ne.6 .and. message.ne.msgchk) bad="*"
 | 
					
						
							|  |  |  |     if(itype.eq.6 .and. message(1:13).ne.msgchk(1:13)) bad="*"
 | 
					
						
							|  |  |  |     if(itype.eq.6 .and. len(trim(msgchk)).gt.13) comment='truncated'
 | 
					
						
							|  |  |  |     write(*,1020) imsg,msgchk,message,bad,i3bit,itype,msgtype,comment
 | 
					
						
							| 
									
										
										
										
											2018-03-05 14:49:51 -05:00
										 |  |  | 1020    format(i2,'.',1x,a22,1x,a22,1x,a1,2i2,1x,a10,1x,a9)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enddo
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if(nmsg.eq.1) then
 | 
					
						
							|  |  |  |      write(*,1030) msgbits(1:56)
 | 
					
						
							|  |  |  | 1030 format(/'Call1: ',28i1,'    Call2: ',28i1)
 | 
					
						
							|  |  |  |      write(*,1032) msgbits(57:72),msgbits(73:75),msgbits(76:87)
 | 
					
						
							|  |  |  | 1032 format('Grid:  ',16i1,'   3Bit: ',3i1,'    CRC12: ',12i1)
 | 
					
						
							|  |  |  |      write(*,1034) itone
 | 
					
						
							|  |  |  | 1034 format(/'Channel symbols:'/79i1)
 | 
					
						
							|  |  |  |   endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 999 end program ft8code
 |