WSJT-X/lib/genmsk144.f90
Joe Taylor 9993760bac Re-enable MSK144 click-to-decode, top panel only.
Fix the improper display of "Fast" checkbox.
Disable "CQ nnn" checkbox if MyCall is not K1JT or K9AN.
Use AppDir as path to execute the LDPC encode program.
Don't display submodes in mode label for JTMSK, MSK144.
Make Rx Freq spinner invisible in MSK144 mode.


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7001 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2016-08-04 19:30:27 +00:00

184 lines
5.2 KiB
Fortran

subroutine genmsk144(msg0,ichk,msgsent,i4tone,itype,pchk_file,ldpc_msg, &
encodeExeFile)
!!!!!!!!!!!!!!!!!! Experimental small blocklength ldpc version
! s8 + 48bits + s8 + 80 bits = 144 bits (72ms message duration)
!
! Encode a JTMSK message
! Input:
! - msg0 requested message to be transmitted
! - ichk if ichk=1, return only msgsent
! if ichk.ge.10000, set imsg=ichk-10000 for short msg
! - msgsent message as it will be decoded
! - i4tone array of audio tone values, 0 or 1
! - itype message type
! 1 = standard message "Call_1 Call_2 Grid/Rpt"
! 2 = type 1 prefix
! 3 = type 1 suffix
! 4 = type 2 prefix
! 5 = type 2 suffix
! 6 = free text (up to 13 characters)
! 7 = short message "<Call_1 Call2> Rpt"
use iso_c_binding, only: c_loc,c_size_t
use packjt
use hashing
character*512 pchk_file,gen_file,ldpc_msg,ldpc_cw,encodeExeFile
character*120 fname1,fname2
character*2048 cmnd
character*22 msg0
character*22 message !Message to be generated
character*22 msgsent !Message as it will be received
integer*4 i4Msg6BitWords(13) !72-bit message as 6-bit words
integer*4 i4tone(144) !
integer*1, target:: i1Msg8BitBytes(10) !80 bits represented in 10 bytes
integer*1 codeword(128) !Encoded bits before re-ordering
integer*1 msgbits(80) !72-bit message + 8-bit hash
integer*1 bitseq(144) !Tone #s, data and sync (values 0-1)
integer*1 i1hash(4)
integer*1 b7(7)
integer*1 s8(8)
integer*1 b11(11)
integer*1 b13(13)
real*8 pp(12)
real*8 xi(864),xq(864),pi,twopi
data b7/1,1,1,0,0,1,0/
data s8/0,1,1,1,0,0,1,0/
data b11/1,1,1,0,0,0,1,0,0,1,0/ !Barker 11 code
data b13/1,1,1,1,1,0,0,1,1,0,1,0,1/ !Barker 13 code
equivalence (ihash,i1hash)
logical first
data first/.true./
save
i=index(pchk_file,".pchk")
gen_file=pchk_file(1:i-1)//".gen"
i=index(ldpc_msg,"ldpc_msg")
ldpc_cw=ldpc_msg(1:i-1)//"ldpc_cw"
fname1=trim(ldpc_msg)
fname2=trim(ldpc_cw)
! call init_ldpc(trim(pchk_file)//char(0),trim(gen_file)//char(0))
if( first ) then
first=.false.
nsym=128
pi=4.*atan(1.0)
twopi=8.*atan(1.0)
do i=1,12
pp(i)=sin( (i-1)*pi/12 )
enddo
endif
if(msg0(1:1).eq.'@') then !Generate a fixed tone
read(msg0(2:5),*,end=1,err=1) nfreq !at specified frequency
go to 2
1 nfreq=1000
2 i4tone(1)=nfreq
else
message=msg0
do i=1,22
if(ichar(message(i:i)).eq.0) then
message(i:)=' '
exit
endif
enddo
do i=1,22 !Strip leading blanks
if(message(1:1).ne.' ') exit
message=message(i+1:)
enddo
if(message(1:1).eq.'<') then
call genmsk40(message,msgsent,ichk,i4tone,itype,pchk_file, &
fname1,fname2)
if(itype.lt.0) go to 999
i4tone(41)=-40
go to 999
endif
call packmsg(message,i4Msg6BitWords,itype) !Pack into 12 6-bit bytes
call unpackmsg(i4Msg6BitWords,msgsent) !Unpack to get msgsent
if(ichk.eq.1) go to 999
i4=0
ik=0
im=0
do i=1,12
nn=i4Msg6BitWords(i)
do j=1, 6
ik=ik+1
i4=i4+i4+iand(1,ishft(nn,j-6))
i4=iand(i4,255)
if(ik.eq.8) then
im=im+1
! if(i4.gt.127) i4=i4-256
i1Msg8BitBytes(im)=i4
ik=0
endif
enddo
enddo
ihash=nhash(c_loc(i1Msg8BitBytes),int(9,c_size_t),146)
ihash=2*iand(ihash,32767) !Generate the 8-bit hash
i1Msg8BitBytes(10)=i1hash(1) !CRC to byte 10
mbit=0
do i=1, 10
i1=i1Msg8BitBytes(i)
do ibit=1,8
mbit=mbit+1
msgbits(mbit)=iand(1,ishft(i1,ibit-8))
enddo
enddo
! call ldpc_encode(msgbits,codeword)
! print*,fname1
! print*,fname2
open(24,file=fname1,status='unknown')
write(24,1010) msgbits
1010 format(80i1)
close(24)
cmnd=trim(encodeExeFile)//' "'//trim(pchk_file)//'" "'// &
trim(gen_file)//'" "'//trim(fname1)//'" "'//trim(fname2)//'"'
call system(trim(cmnd))
open(24,file=fname2,status='old')
read(24,1020) codeword
1020 format(128i1)
close(24)
!Create 144-bit channel vector:
!8-bit sync word + 48 bits + 8-bit sync word + 80 bits
bitseq=0
bitseq(1:8)=s8
bitseq(9:56)=codeword(1:48)
bitseq(57:64)=s8
bitseq(65:144)=codeword(49:128)
bitseq=2*bitseq-1
xq(1:6)=bitseq(1)*pp(7:12) !first bit is mapped to 1st half-symbol on q
do i=1,71
is=(i-1)*12+7
xq(is:is+11)=bitseq(2*i+1)*pp
enddo
xq(864-5:864)=bitseq(1)*pp(1:6) !last half symbol
do i=1,72
is=(i-1)*12+1
xi(is:is+11)=bitseq(2*i)*pp
enddo
! Map I and Q to tones.
i4tone=0
do i=1,72
i4tone(2*i-1)=(bitseq(2*i)*bitseq(2*i-1)+1)/2;
i4tone(2*i)=-(bitseq(2*i)*bitseq(mod(2*i,144)+1)-1)/2;
enddo
endif
! Flip polarity
i4tone=-i4tone+1
999 return
end subroutine genmsk144