2024-09-17 10:24:02 -04:00
|
|
|
subroutine sfox_pack(line,ckey,bMoreCQs,bSendMsg,freeTextMsg,xin)
|
|
|
|
|
|
|
|
use qpc_mod
|
|
|
|
use packjt
|
|
|
|
use packjt77
|
|
|
|
use julian
|
|
|
|
integer*8 n47,n58,now
|
|
|
|
integer*1 xin(0:49) !Packed message as 7-bit symbols
|
|
|
|
logical*1 bMoreCQs,bSendMsg
|
|
|
|
logical text
|
|
|
|
character*120 line !SuperFox message pieces
|
|
|
|
character*10 ckey
|
|
|
|
character*26 freeTextMsg
|
|
|
|
character*13 w(16)
|
|
|
|
character*11 c11
|
|
|
|
character*329 msgbits !Packed message as bits
|
|
|
|
character*38 c
|
|
|
|
data c/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ/'/
|
|
|
|
|
|
|
|
i0=index(line,'/')
|
|
|
|
i3=0 !Default to i3=0, standard message
|
|
|
|
|
|
|
|
! Split the command line into words
|
|
|
|
w=' '
|
|
|
|
i1=1
|
|
|
|
do j=1,16
|
|
|
|
do i=i1,min(i1+12,120)
|
|
|
|
if(line(i:i).eq.' ') exit
|
|
|
|
enddo
|
|
|
|
i2=i-1
|
|
|
|
w(j)=line(i1:i2)
|
|
|
|
do i=i2+1,120
|
|
|
|
if(line(i:i).ne.' ') exit
|
|
|
|
enddo
|
|
|
|
i1=i
|
|
|
|
if(i1.ge.120) exit
|
|
|
|
enddo
|
|
|
|
nwords=j
|
|
|
|
|
|
|
|
do i=1,nwords
|
|
|
|
if(w(i)(1:1).eq.' ') then
|
|
|
|
nwords=i-1
|
|
|
|
exit
|
|
|
|
endif
|
|
|
|
enddo
|
|
|
|
|
|
|
|
do i=1,329 !Set all msgbits to '0'
|
|
|
|
msgbits(i:i)='0'
|
|
|
|
enddo
|
|
|
|
|
|
|
|
now=itime8()/30
|
|
|
|
now=30*now
|
|
|
|
read(ckey(5:10),*) nsignature
|
|
|
|
|
|
|
|
write(msgbits(307:326),'(b20.20)') nsignature !Insert the digital signature
|
|
|
|
|
|
|
|
if(w(1)(1:3).eq.'CQ ') then
|
|
|
|
i3=3
|
|
|
|
c11=w(2)(1:11)
|
|
|
|
n58=0
|
|
|
|
do i=1,11
|
|
|
|
n58=n58*38 + index(c,c11(i:i)) - 1
|
|
|
|
enddo
|
|
|
|
write(msgbits(1:58),'(b58.58)') n58
|
|
|
|
call packgrid(w(3)(1:4),n15,text)
|
|
|
|
write(msgbits(59:73),'(b15.15)') n15
|
|
|
|
write(msgbits(327:329),'(b3.3)') i3 !Message type i3=3
|
|
|
|
go to 800
|
|
|
|
endif
|
|
|
|
|
|
|
|
call pack28(w(1),n28) !Fox call
|
|
|
|
write(msgbits(1:28),'(b28.28)') n28
|
|
|
|
nh1=0 !Number of Hound calls with RR73
|
|
|
|
nh2=0 !Number of Hound calls with report
|
|
|
|
|
|
|
|
! Default report is RR73 if we're also sending a free text message.
|
|
|
|
if(bSendMsg) msgbits(141:160)='11111111111111111111'
|
|
|
|
|
|
|
|
j=29
|
|
|
|
|
|
|
|
! Process callsigns with RR73
|
|
|
|
do i=2,nwords
|
|
|
|
if(w(i)(1:1).eq.'+' .or. w(i)(1:1).eq.'-') cycle !Skip report words
|
|
|
|
i1=min(i+1,nwords)
|
|
|
|
if(w(i1)(1:1) .eq.'+' .or. w(i1)(1:1).eq.'-') cycle !Skip if i+1 is report
|
|
|
|
call pack28(w(i),n28)
|
|
|
|
write(msgbits(j:j+27),1002) n28 !Insert this call for RR73 message
|
|
|
|
1002 format(b28.28)
|
|
|
|
j=j+28
|
|
|
|
nh1=nh1+1
|
2024-09-17 13:21:01 -04:00
|
|
|
if(nh1.ge.5) exit !At most 5 RR73 callsigns
|
2024-09-17 10:24:02 -04:00
|
|
|
enddo
|
|
|
|
|
|
|
|
! Process callsigns with a report
|
|
|
|
j=169
|
|
|
|
j2=281
|
|
|
|
if(bSendMsg) then
|
|
|
|
i3=2
|
|
|
|
j=29 + 28*nh1
|
|
|
|
j2=141 + 5*nh1
|
|
|
|
endif
|
|
|
|
|
|
|
|
do i=2,nwords
|
|
|
|
i1=min(i+1,nwords)
|
|
|
|
if(w(i1)(1:1).eq.'+' .or. w(i1)(1:1).eq.'-') then
|
|
|
|
call pack28(w(i),n28)
|
|
|
|
write(msgbits(j:j+27),1002) n28 !Insert this call
|
|
|
|
read(w(i1),*) n !Valid reports are -18 to +12, plus RR73
|
|
|
|
if(n.lt.-18) n=-18 !... Even numbers only ...
|
|
|
|
if(n.gt.12) n=12
|
|
|
|
write(msgbits(j2:j2+4),1000) n+18
|
|
|
|
1000 format(b5.5)
|
|
|
|
w(i1)=""
|
|
|
|
nh2=nh2+1
|
|
|
|
! print*,'C',i3,i,j,n,w(i)
|
|
|
|
if( nh2.ge.4 .or. (nh1+nh2).ge.9 ) exit ! At most 4 callsigns w/reports
|
|
|
|
j=j+28
|
|
|
|
j2=j2+5
|
|
|
|
endif
|
|
|
|
enddo
|
|
|
|
|
|
|
|
800 if(bSendMsg) then
|
|
|
|
i1=26
|
|
|
|
do i=1,26
|
|
|
|
if(freeTextMsg(i:i).ne.' ') i1=i
|
|
|
|
enddo
|
|
|
|
do i=i1+1,26
|
|
|
|
freeTextMsg(i:i)='.'
|
|
|
|
enddo
|
|
|
|
if(i3.eq.3) then
|
|
|
|
call packtext77(freeTextMsg(1:13),msgbits(74:144))
|
|
|
|
call packtext77(freeTextMsg(14:26),msgbits(145:215))
|
|
|
|
elseif(i3.eq.2) then
|
|
|
|
call packtext77(freeTextMsg(1:13),msgbits(161:231))
|
|
|
|
call packtext77(freeTextMsg(14:26),msgbits(232:302))
|
|
|
|
endif
|
|
|
|
write(msgbits(327:329),'(b3.3)') i3 !Message type i3=2
|
|
|
|
endif
|
|
|
|
if(bMoreCQs) msgbits(306:306)='1'
|
|
|
|
|
|
|
|
read(msgbits,1004) xin(0:46)
|
|
|
|
1004 format(47b7)
|
|
|
|
|
|
|
|
mask21=2**21 - 1
|
|
|
|
n47=47
|
|
|
|
ncrc21=iand(nhash2(xin,n47,571),mask21) !Compute 21-bit CRC
|
|
|
|
xin(47)=ncrc21/16384 !First 7 of 21 bits
|
|
|
|
xin(48)=iand(ncrc21/128,127) !Next 7 bits
|
|
|
|
xin(49)=iand(ncrc21,127) !Last 7 bits
|
|
|
|
|
|
|
|
xin=xin(49:0:-1) !Reverse the symbol order
|
|
|
|
! NB: CRC is now in first three symbols, fox call in the last four.
|
|
|
|
|
|
|
|
read(msgbits(327:329),'(b3)') i3
|
|
|
|
|
|
|
|
return
|
|
|
|
end subroutine sfox_pack
|