mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-26 14:08:40 -04:00
More WIP toward implementing sfox_tx.
This commit is contained in:
parent
56ce1b7441
commit
a5f68966ab
@ -1,4 +1,4 @@
|
|||||||
subroutine foxgen(bSuperFox,data_dir)
|
subroutine foxgen(bSuperFox,fname)
|
||||||
|
|
||||||
! Called from MainWindow::foxTxSequencer() to generate the Tx waveform in
|
! Called from MainWindow::foxTxSequencer() to generate the Tx waveform in
|
||||||
! FT8 Fox mode. The Tx message can contain up to 5 "slots", each carrying
|
! FT8 Fox mode. The Tx message can contain up to 5 "slots", each carrying
|
||||||
@ -18,7 +18,7 @@ subroutine foxgen(bSuperFox,data_dir)
|
|||||||
parameter (NWAVE=(160+2)*134400*4) !the biggest waveform we generate (FST4-1800 at 48kHz)
|
parameter (NWAVE=(160+2)*134400*4) !the biggest waveform we generate (FST4-1800 at 48kHz)
|
||||||
parameter (NFFT=614400,NH=NFFT/2)
|
parameter (NFFT=614400,NH=NFFT/2)
|
||||||
logical*1 bSuperFox
|
logical*1 bSuperFox
|
||||||
character*(*) data_dir
|
character*(*) fname
|
||||||
character*40 cmsg
|
character*40 cmsg
|
||||||
character*37 msg,msgsent
|
character*37 msg,msgsent
|
||||||
integer itone(79)
|
integer itone(79)
|
||||||
@ -33,12 +33,13 @@ subroutine foxgen(bSuperFox,data_dir)
|
|||||||
|
|
||||||
if(bSuperFox) then
|
if(bSuperFox) then
|
||||||
! call foxgen2(nslots,cmsg,cmnd)
|
! call foxgen2(nslots,cmsg,cmnd)
|
||||||
open(25,file=data_dir,status='unknown')
|
open(25,file=fname,status='unknown')
|
||||||
|
rewind(25)
|
||||||
write(25,'(a40)') cmsg(1:nslots)
|
write(25,'(a40)') cmsg(1:nslots)
|
||||||
close(25)
|
close(25)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
fstep=60.d0
|
fstep=60.d0
|
||||||
dfreq=6.25d0
|
dfreq=6.25d0
|
||||||
dt=1.d0/48000.d0
|
dt=1.d0/48000.d0
|
||||||
|
@ -15,31 +15,13 @@ CFLAGS= -O9 -Wall
|
|||||||
%.o: %.F90
|
%.o: %.F90
|
||||||
${FC} ${FFLAGS} -c $<
|
${FC} ${FFLAGS} -c $<
|
||||||
|
|
||||||
all: rs_sf.a rstest
|
all: sfox_tx
|
||||||
|
|
||||||
OBJS1 = rstest.o ran1.o rs_sf.a
|
OBJS1 = sfox_tx.o foxgen2.o sfox_assemble.o
|
||||||
rstest: $(OBJS1)
|
|
||||||
$(FC) -o rstest $(OBJS1) rs_sf.a
|
|
||||||
|
|
||||||
OBJS2 = rs_125_49.o ran1.o get_crc14.o rs_sf.a
|
sfox_tx: $(OBJS1)
|
||||||
rs_125_49: $(OBJS2)
|
$(FC) -o sfox_tx $(OBJS1) libwsjt_fort.a
|
||||||
$(FC) -o rs_125_49 $(OBJS2) rs_sf.a
|
|
||||||
|
|
||||||
rs_sf.a: init_rs_sf.o encode_rs_sf.o decode_rs_sf.o rs_sf.o
|
|
||||||
ar -crs rs_sf.a init_rs_sf.o encode_rs_sf.o decode_rs_sf.o rs_sf.o
|
|
||||||
|
|
||||||
init_rs_sf.o: init_rs.c
|
|
||||||
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
|
|
||||||
encode_rs_sf.o: encode_rs.c
|
|
||||||
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
|
|
||||||
decode_rs_sf.o: decode_rs.c
|
|
||||||
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
|
|
||||||
|
|
||||||
encode_rs_8.o: encode_rs.c
|
|
||||||
gcc -DFIXED=1 $(CFLAGS) -c -o $@ $^
|
|
||||||
decode_rs_8.o: decode_rs.c
|
|
||||||
gcc -DFIXED=1 $(CFLAGS) -c -o $@ $^
|
|
||||||
|
|
||||||
.PHONY : clean
|
.PHONY : clean
|
||||||
clean:
|
clean:
|
||||||
-rm -f *.o *.a *.exe
|
-rm -f *.o *.exe
|
||||||
|
@ -4,7 +4,7 @@ subroutine foxgen2(nslots,cmsg,line)
|
|||||||
! generate the waveform to be transmitted. We need to parse the old-style
|
! generate the waveform to be transmitted. We need to parse the old-style
|
||||||
! Fox messages and extract the necessary pieces.
|
! Fox messages and extract the necessary pieces.
|
||||||
|
|
||||||
use packjt77
|
! use packjt77
|
||||||
character*120 line
|
character*120 line
|
||||||
character*40 cmsg(5) !Old-style Fox messages are here
|
character*40 cmsg(5) !Old-style Fox messages are here
|
||||||
character*37 msg
|
character*37 msg
|
||||||
@ -76,3 +76,53 @@ subroutine foxgen2(nslots,cmsg,line)
|
|||||||
|
|
||||||
return
|
return
|
||||||
end subroutine foxgen2
|
end subroutine foxgen2
|
||||||
|
|
||||||
|
subroutine split77(msg,nwords,nw,w)
|
||||||
|
|
||||||
|
! Convert msg to upper case; collapse multiple blanks; parse into words.
|
||||||
|
|
||||||
|
character*37 msg
|
||||||
|
character*13 w(19)
|
||||||
|
character*1 c,c0
|
||||||
|
character*6 bcall_1
|
||||||
|
logical ok1
|
||||||
|
integer nw(19)
|
||||||
|
|
||||||
|
iz=len(trim(msg))
|
||||||
|
j=0
|
||||||
|
k=0
|
||||||
|
n=0
|
||||||
|
c0=' '
|
||||||
|
w=' '
|
||||||
|
do i=1,iz
|
||||||
|
if(ichar(msg(i:i)).eq.0) msg(i:i)=' '
|
||||||
|
c=msg(i:i) !Single character
|
||||||
|
if(c.eq.' ' .and. c0.eq.' ') cycle !Skip leading/repeated blanks
|
||||||
|
if(c.ne.' ' .and. c0.eq.' ') then
|
||||||
|
k=k+1 !New word
|
||||||
|
n=0
|
||||||
|
endif
|
||||||
|
j=j+1 !Index in msg
|
||||||
|
n=n+1 !Index in word
|
||||||
|
if(c.ge.'a' .and. c.le.'z') c=char(ichar(c)-32) !Force upper case
|
||||||
|
msg(j:j)=c
|
||||||
|
if(n.le.13) w(k)(n:n)=c !Copy character c into word
|
||||||
|
c0=c
|
||||||
|
enddo
|
||||||
|
iz=j !Message length
|
||||||
|
nwords=k !Number of words in msg
|
||||||
|
if(nwords.le.0) go to 900
|
||||||
|
do i=1,nwords
|
||||||
|
nw(i)=len(trim(w(i)))
|
||||||
|
enddo
|
||||||
|
msg(iz+1:)=' '
|
||||||
|
if(nwords.lt.3) go to 900
|
||||||
|
call chkcall(w(3),bcall_1,ok1)
|
||||||
|
if(ok1 .and. w(1)(1:3).eq.'CQ ') then
|
||||||
|
w(1)='CQ_'//w(2)(1:10) !Make "CQ " into "CQ_"
|
||||||
|
w(2:12)=w(3:13) !Move all remaining words down by one
|
||||||
|
nwords=nwords-1
|
||||||
|
endif
|
||||||
|
|
||||||
|
900 return
|
||||||
|
end subroutine split77
|
||||||
|
@ -1,23 +1,47 @@
|
|||||||
program sfox_tx
|
program sfox_tx
|
||||||
|
|
||||||
character*120 fname
|
! Functioins of this program are required in order to create a SuperFox
|
||||||
character*40 cmsg(5)
|
! transmission.
|
||||||
integer itone(151)
|
|
||||||
|
|
||||||
|
! The present version goes through the following steps:
|
||||||
|
! 1. Read old-style Fox messages from file 'sfox_1.dat' in the WSJT-X
|
||||||
|
! writable data directory.
|
||||||
|
! 2. Parse up to NSlots=5 messages to extract MyCall, up to 10 Hound
|
||||||
|
! calls, and the report or RR73 to be sent to each Hound.
|
||||||
|
! 3. Assemble and encode a single SuperFox message to produce itone(1:151),
|
||||||
|
! the array of channel symbol values.
|
||||||
|
! 4. Write the contents of itone to file 'sfox_2.dat'.
|
||||||
|
|
||||||
|
character*120 fname !Full path for sfox.dat
|
||||||
|
character*120 line !List of SuperFox message pieces
|
||||||
|
character*40 cmsg(5) !Old-style Fox messages
|
||||||
|
integer itone(151) !SuperFox channel-symbol values
|
||||||
|
|
||||||
|
open(70,file='fort.70',status='unknown',position='append')
|
||||||
call getarg(1,fname)
|
call getarg(1,fname)
|
||||||
open(25,file=trim(fname),status='unknown')
|
open(25,file=trim(fname),status='unknown')
|
||||||
do i=1,5
|
do i=1,5
|
||||||
read(25,1000,end=10) cmsg(i)
|
read(25,1000,end=10) cmsg(i)
|
||||||
1000 format(a40)
|
1000 format(a40)
|
||||||
! write(*,1000) cmsg(i)
|
write(70,*) 'AAA',i,cmsg(i)
|
||||||
enddo
|
enddo
|
||||||
|
i=6
|
||||||
|
|
||||||
10 rewind(25)
|
10 close(25)
|
||||||
do i=1,151
|
nslots=i-1
|
||||||
|
write(70,*) 'BBB',nslots
|
||||||
|
call foxgen2(nslots,cmsg,line)
|
||||||
|
write(70,*) 'CCC ',trim(line)
|
||||||
|
|
||||||
|
do i=1,151 !Dummy loop to populate itone during tests
|
||||||
itone(i)=i-1
|
itone(i)=i-1
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
i1=index(fname,'sfox_1.dat')
|
||||||
|
fname(i1:i1+9)='sfox_2.dat'
|
||||||
|
open(25,file=trim(fname),status='unknown')
|
||||||
write(25,1100) itone
|
write(25,1100) itone
|
||||||
1100 format(20i4)
|
1100 format(20i4)
|
||||||
close(25)
|
close(25)
|
||||||
|
|
||||||
end program sfox_tx
|
end program sfox_tx
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
subroutine sfox_wave(fname)
|
subroutine sfox_wave(fname)
|
||||||
|
|
||||||
|
! Called by WSJT-X when it's time for SuperFox to transmit. Reads array
|
||||||
|
! itone(1:151) from disk file 'sfox_2.dat' in the writable data directory.
|
||||||
|
|
||||||
parameter (NWAVE=(160+2)*134400*4) !Max WSJT-X waveform (FST4-1800 at 48kHz)
|
parameter (NWAVE=(160+2)*134400*4) !Max WSJT-X waveform (FST4-1800 at 48kHz)
|
||||||
parameter (NN=151,NSPS=1024)
|
parameter (NN=151,NSPS=1024)
|
||||||
character*(*) fname
|
character*(*) fname
|
||||||
@ -8,8 +11,8 @@ subroutine sfox_wave(fname)
|
|||||||
|
|
||||||
common/foxcom/wave(NWAVE)
|
common/foxcom/wave(NWAVE)
|
||||||
|
|
||||||
open(25,file=trim(fname),status='unknown')
|
open(25,file=trim(fname),status='unknown',err=900)
|
||||||
read(25,'(20i4)') itone
|
read(25,'(20i4)',err=900,end=900) itone
|
||||||
close(25)
|
close(25)
|
||||||
|
|
||||||
! Generate the SuperFox waveform.
|
! Generate the SuperFox waveform.
|
||||||
@ -22,7 +25,6 @@ subroutine sfox_wave(fname)
|
|||||||
k=0
|
k=0
|
||||||
do j=1,NN
|
do j=1,NN
|
||||||
f=f0 + baud*mod(itone(j),128)
|
f=f0 + baud*mod(itone(j),128)
|
||||||
print*,'A',j,itone(j),f
|
|
||||||
dphi=twopi*f*dt
|
dphi=twopi*f*dt
|
||||||
do ii=1,4*NSPS
|
do ii=1,4*NSPS
|
||||||
k=k+1
|
k=k+1
|
||||||
@ -32,5 +34,7 @@ subroutine sfox_wave(fname)
|
|||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
900 continue
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine sfox_wave
|
end subroutine sfox_wave
|
||||||
|
@ -4826,7 +4826,7 @@ void MainWindow::guiUpdate()
|
|||||||
QString foxCall=m_config.my_callsign() + " ";
|
QString foxCall=m_config.my_callsign() + " ";
|
||||||
::memcpy(foxcom_.mycall, foxCall.toLatin1(), sizeof foxcom_.mycall); //Copy Fox callsign into foxcom_
|
::memcpy(foxcom_.mycall, foxCall.toLatin1(), sizeof foxcom_.mycall); //Copy Fox callsign into foxcom_
|
||||||
bool bSuperFox=m_config.superFox();
|
bool bSuperFox=m_config.superFox();
|
||||||
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox.dat")).toLocal8Bit()};
|
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_1.dat")).toLocal8Bit()};
|
||||||
foxgen_(&bSuperFox, fname.constData(), (FCL)fname.size());
|
foxgen_(&bSuperFox, fname.constData(), (FCL)fname.size());
|
||||||
if(bSuperFox) sfox_tx();
|
if(bSuperFox) sfox_tx();
|
||||||
}
|
}
|
||||||
@ -10303,7 +10303,7 @@ Transmit:
|
|||||||
QString foxCall=m_config.my_callsign() + " ";
|
QString foxCall=m_config.my_callsign() + " ";
|
||||||
::memcpy(foxcom_.mycall, foxCall.toLatin1(),sizeof foxcom_.mycall); //Copy Fox callsign into foxcom_
|
::memcpy(foxcom_.mycall, foxCall.toLatin1(),sizeof foxcom_.mycall); //Copy Fox callsign into foxcom_
|
||||||
bool bSuperFox=m_config.superFox();
|
bool bSuperFox=m_config.superFox();
|
||||||
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox.dat")).toLocal8Bit()};
|
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_1.dat")).toLocal8Bit()};
|
||||||
foxgen_(&bSuperFox, fname.constData(), (FCL)fname.size());
|
foxgen_(&bSuperFox, fname.constData(), (FCL)fname.size());
|
||||||
if(bSuperFox) sfox_tx();
|
if(bSuperFox) sfox_tx();
|
||||||
m_tFoxTxSinceCQ++;
|
m_tFoxTxSinceCQ++;
|
||||||
@ -10884,7 +10884,7 @@ void MainWindow::on_jt65Button_clicked()
|
|||||||
void MainWindow::sfox_tx()
|
void MainWindow::sfox_tx()
|
||||||
{
|
{
|
||||||
// qint64 ms0 = QDateTime::currentMSecsSinceEpoch();
|
// qint64 ms0 = QDateTime::currentMSecsSinceEpoch();
|
||||||
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox.dat")).toLocal8Bit()};
|
auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir().absoluteFilePath("sfox_1.dat")).toLocal8Bit()};
|
||||||
p2.start("sfox_tx", QStringList {fname});
|
p2.start("sfox_tx", QStringList {fname});
|
||||||
p2.waitForFinished();
|
p2.waitForFinished();
|
||||||
sfox_wave_(fname.constData(), (FCL)fname.size());
|
sfox_wave_(fname.constData(), (FCL)fname.size());
|
||||||
|
Loading…
Reference in New Issue
Block a user