mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-10-01 17:46:55 -04:00
Now working with decoding done in a separate process, jt9.exe.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2756 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
44d44962d0
commit
f715ea6347
12
commons.h
12
commons.h
@ -8,6 +8,7 @@ extern "C" {
|
|||||||
extern struct {
|
extern struct {
|
||||||
float ss[184*NSMAX]; //This is "common/jt9com/..." in fortran
|
float ss[184*NSMAX]; //This is "common/jt9com/..." in fortran
|
||||||
float savg[NSMAX];
|
float savg[NSMAX];
|
||||||
|
float c0[2*1800*1500];
|
||||||
short int d2[1800*12000];
|
short int d2[1800*12000];
|
||||||
int nutc; //UTC as integer, HHMM
|
int nutc; //UTC as integer, HHMM
|
||||||
int ndiskdat; //1 ==> data read from *.wav file
|
int ndiskdat; //1 ==> data read from *.wav file
|
||||||
@ -15,12 +16,17 @@ extern struct {
|
|||||||
int nfqso; //User-selected QSO freq (kHz)
|
int nfqso; //User-selected QSO freq (kHz)
|
||||||
int newdat; //1 ==> new data, must do long FFT
|
int newdat; //1 ==> new data, must do long FFT
|
||||||
int npts8; //npts for c0() array
|
int npts8; //npts for c0() array
|
||||||
int nfb; //High decode limit (kHz)
|
int nfa; //Low decode limit (Hz)
|
||||||
|
int nfb; //High decode limit (Hz)
|
||||||
int ntol; //+/- decoding range around fQSO (Hz)
|
int ntol; //+/- decoding range around fQSO (Hz)
|
||||||
int kin;
|
int kin;
|
||||||
int nzhsym;
|
int nzhsym;
|
||||||
int nsynced;
|
int nsave;
|
||||||
int ndecoded;
|
int nagain;
|
||||||
|
int ndepth;
|
||||||
|
int nrxlog;
|
||||||
|
int nfsample;
|
||||||
|
char datetime[20];
|
||||||
} jt9com_;
|
} jt9com_;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
282
killbyname.cpp
Normal file
282
killbyname.cpp
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
#include <tlhelp32.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int killbyname(const char *szToTerminate)
|
||||||
|
// Created: 6/23/2000 (Ravi Kochhar)
|
||||||
|
// Last modified: 3/10/2002 (RK)
|
||||||
|
// Please report any problems or bugs to kochhar@physiology.wisc.edu
|
||||||
|
// The latest version of this routine can be found at:
|
||||||
|
// http://www.neurophys.wisc.edu/ravi/software/killproc/
|
||||||
|
// Terminate the process "szToTerminate" if it is currently running
|
||||||
|
// This works for Win/95/98/ME and also Win/NT/2000/XP
|
||||||
|
// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE"
|
||||||
|
// will both work (for szToTerminate)
|
||||||
|
// Return codes are as follows:
|
||||||
|
// 0 = Process was successfully terminated
|
||||||
|
// 602 = Unable to terminate process for some other reason
|
||||||
|
// 603 = Process was not currently running
|
||||||
|
// 604 = No permission to terminate process
|
||||||
|
// 605 = Unable to load PSAPI.DLL
|
||||||
|
// 606 = Unable to identify system type
|
||||||
|
// 607 = Unsupported OS
|
||||||
|
// 632 = Invalid process name
|
||||||
|
// 700 = Unable to get procedure address from PSAPI.DLL
|
||||||
|
// 701 = Unable to get process list, EnumProcesses failed
|
||||||
|
// 702 = Unable to load KERNEL32.DLL
|
||||||
|
// 703 = Unable to get procedure address from KERNEL32.DLL
|
||||||
|
// 704 = CreateToolhelp32Snapshot failed
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOL bResult,bResultm;
|
||||||
|
DWORD aiPID[1000],iCb=1000,iNumProc; //,iV2000=0;
|
||||||
|
DWORD iCbneeded,i,iFound=0;
|
||||||
|
char szName[MAX_PATH],szToTermUpper[MAX_PATH];
|
||||||
|
HANDLE hProc,hSnapShot,hSnapShotm;
|
||||||
|
OSVERSIONINFO osvi;
|
||||||
|
HINSTANCE hInstLib;
|
||||||
|
int iLen,iLenP,indx;
|
||||||
|
HMODULE hMod;
|
||||||
|
PROCESSENTRY32 procentry;
|
||||||
|
MODULEENTRY32 modentry;
|
||||||
|
|
||||||
|
// Transfer Process name into "szToTermUpper" and convert to upper case
|
||||||
|
iLenP=strlen(szToTerminate);
|
||||||
|
if(iLenP<1 || iLenP>MAX_PATH) return 632;
|
||||||
|
for(indx=0;indx<iLenP;indx++)
|
||||||
|
szToTermUpper[indx]=toupper(szToTerminate[indx]);
|
||||||
|
szToTermUpper[iLenP]=0;
|
||||||
|
|
||||||
|
// PSAPI Function Pointers.
|
||||||
|
BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
|
||||||
|
BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,
|
||||||
|
DWORD, LPDWORD );
|
||||||
|
DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE,
|
||||||
|
LPTSTR, DWORD );
|
||||||
|
|
||||||
|
// ToolHelp Function Pointers.
|
||||||
|
HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ;
|
||||||
|
BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ;
|
||||||
|
BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ;
|
||||||
|
BOOL (WINAPI *lpfModule32First)(HANDLE,LPMODULEENTRY32) ;
|
||||||
|
BOOL (WINAPI *lpfModule32Next)(HANDLE,LPMODULEENTRY32) ;
|
||||||
|
|
||||||
|
// First check what version of Windows we're in
|
||||||
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||||
|
bResult=GetVersionEx(&osvi);
|
||||||
|
if(!bResult) return 606; // Unable to identify system version
|
||||||
|
|
||||||
|
// At Present we only support Win/NT/2000/XP or Win/9x/ME
|
||||||
|
// Seems to work OK in Win7
|
||||||
|
if((osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) &&
|
||||||
|
(osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)) return 607;
|
||||||
|
|
||||||
|
if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
|
||||||
|
{
|
||||||
|
// Win/NT or 2000 or XP
|
||||||
|
|
||||||
|
// Load library and get the procedures explicitly. We do
|
||||||
|
// this so that we don't have to worry about modules using
|
||||||
|
// this code failing to load under Windows 9x, because
|
||||||
|
// it can't resolve references to the PSAPI.DLL.
|
||||||
|
hInstLib = LoadLibraryA("PSAPI.DLL");
|
||||||
|
if(hInstLib == NULL) return 605;
|
||||||
|
|
||||||
|
// Get procedure addresses.
|
||||||
|
lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))
|
||||||
|
GetProcAddress( hInstLib, "EnumProcesses" ) ;
|
||||||
|
lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
|
||||||
|
DWORD, LPDWORD)) GetProcAddress( hInstLib, "EnumProcessModules" ) ;
|
||||||
|
lpfGetModuleBaseName =(DWORD (WINAPI *)(HANDLE, HMODULE, LPTSTR,
|
||||||
|
DWORD )) GetProcAddress( hInstLib, "GetModuleBaseNameA" ) ;
|
||||||
|
|
||||||
|
if(lpfEnumProcesses == NULL || lpfEnumProcessModules == NULL ||
|
||||||
|
lpfGetModuleBaseName == NULL) {
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
bResult=lpfEnumProcesses(aiPID,iCb,&iCbneeded);
|
||||||
|
if(!bResult) {
|
||||||
|
// Unable to get process list, EnumProcesses failed
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 701;
|
||||||
|
}
|
||||||
|
|
||||||
|
// How many processes are there?
|
||||||
|
iNumProc=iCbneeded/sizeof(DWORD);
|
||||||
|
|
||||||
|
// Get and match the name of each process
|
||||||
|
for(i=0;i<iNumProc;i++) {
|
||||||
|
// Get the (module) name for this process
|
||||||
|
strcpy(szName,"Unknown");
|
||||||
|
// First, get a handle to the process
|
||||||
|
hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,
|
||||||
|
aiPID[i]);
|
||||||
|
// Now, get the process name
|
||||||
|
if(hProc) {
|
||||||
|
if(lpfEnumProcessModules(hProc,&hMod,sizeof(hMod),&iCbneeded) ) {
|
||||||
|
iLen=lpfGetModuleBaseName(hProc,hMod,szName,MAX_PATH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hProc);
|
||||||
|
// We will match regardless of lower or upper case
|
||||||
|
if(strcmp(_strupr(szName),szToTermUpper)==0) {
|
||||||
|
// Process found, now terminate it
|
||||||
|
iFound=1;
|
||||||
|
// First open for termination
|
||||||
|
hProc=OpenProcess(PROCESS_TERMINATE,FALSE,aiPID[i]);
|
||||||
|
if(hProc) {
|
||||||
|
if(TerminateProcess(hProc,0)) {
|
||||||
|
// process terminated
|
||||||
|
CloseHandle(hProc);
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
// Unable to terminate process
|
||||||
|
CloseHandle(hProc);
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 602;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Unable to open process for termination
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 604;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
|
||||||
|
{
|
||||||
|
// Win/95 or 98 or ME
|
||||||
|
|
||||||
|
hInstLib = LoadLibraryA("Kernel32.DLL");
|
||||||
|
if( hInstLib == NULL )
|
||||||
|
return 702;
|
||||||
|
|
||||||
|
// Get procedure addresses.
|
||||||
|
// We are linking to these functions of Kernel32
|
||||||
|
// explicitly, because otherwise a module using
|
||||||
|
// this code would fail to load under Windows NT,
|
||||||
|
// which does not have the Toolhelp32
|
||||||
|
// functions in the Kernel 32.
|
||||||
|
lpfCreateToolhelp32Snapshot=
|
||||||
|
(HANDLE(WINAPI *)(DWORD,DWORD))
|
||||||
|
GetProcAddress( hInstLib,
|
||||||
|
"CreateToolhelp32Snapshot" ) ;
|
||||||
|
lpfProcess32First=
|
||||||
|
(BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
|
||||||
|
GetProcAddress( hInstLib, "Process32First" ) ;
|
||||||
|
lpfProcess32Next=
|
||||||
|
(BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
|
||||||
|
GetProcAddress( hInstLib, "Process32Next" ) ;
|
||||||
|
lpfModule32First=
|
||||||
|
(BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
|
||||||
|
GetProcAddress( hInstLib, "Module32First" ) ;
|
||||||
|
lpfModule32Next=
|
||||||
|
(BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
|
||||||
|
GetProcAddress( hInstLib, "Module32Next" ) ;
|
||||||
|
if( lpfProcess32Next == NULL ||
|
||||||
|
lpfProcess32First == NULL ||
|
||||||
|
lpfModule32Next == NULL ||
|
||||||
|
lpfModule32First == NULL ||
|
||||||
|
lpfCreateToolhelp32Snapshot == NULL )
|
||||||
|
{
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 703;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Process32.. and Module32.. routines return names in all uppercase
|
||||||
|
|
||||||
|
// Get a handle to a Toolhelp snapshot of all the systems processes.
|
||||||
|
|
||||||
|
hSnapShot = lpfCreateToolhelp32Snapshot(
|
||||||
|
TH32CS_SNAPPROCESS, 0 ) ;
|
||||||
|
if( hSnapShot == INVALID_HANDLE_VALUE )
|
||||||
|
{
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 704;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the first process' information.
|
||||||
|
procentry.dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
bResult=lpfProcess32First(hSnapShot,&procentry);
|
||||||
|
|
||||||
|
// While there are processes, keep looping and checking.
|
||||||
|
while(bResult)
|
||||||
|
{
|
||||||
|
// Get a handle to a Toolhelp snapshot of this process.
|
||||||
|
hSnapShotm = lpfCreateToolhelp32Snapshot(
|
||||||
|
TH32CS_SNAPMODULE, procentry.th32ProcessID) ;
|
||||||
|
if( hSnapShotm == INVALID_HANDLE_VALUE )
|
||||||
|
{
|
||||||
|
CloseHandle(hSnapShot);
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 704;
|
||||||
|
}
|
||||||
|
// Get the module list for this process
|
||||||
|
modentry.dwSize=sizeof(MODULEENTRY32);
|
||||||
|
bResultm=lpfModule32First(hSnapShotm,&modentry);
|
||||||
|
|
||||||
|
// While there are modules, keep looping and checking
|
||||||
|
while(bResultm)
|
||||||
|
{
|
||||||
|
if(strcmp(modentry.szModule,szToTermUpper)==0)
|
||||||
|
{
|
||||||
|
// Process found, now terminate it
|
||||||
|
iFound=1;
|
||||||
|
// First open for termination
|
||||||
|
hProc=OpenProcess(PROCESS_TERMINATE,FALSE,procentry.th32ProcessID);
|
||||||
|
if(hProc)
|
||||||
|
{
|
||||||
|
if(TerminateProcess(hProc,0))
|
||||||
|
{
|
||||||
|
// process terminated
|
||||||
|
CloseHandle(hSnapShotm);
|
||||||
|
CloseHandle(hSnapShot);
|
||||||
|
CloseHandle(hProc);
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Unable to terminate process
|
||||||
|
CloseHandle(hSnapShotm);
|
||||||
|
CloseHandle(hSnapShot);
|
||||||
|
CloseHandle(hProc);
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 602;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Unable to open process for termination
|
||||||
|
CloseHandle(hSnapShotm);
|
||||||
|
CloseHandle(hSnapShot);
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 604;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Look for next modules for this process
|
||||||
|
modentry.dwSize=sizeof(MODULEENTRY32);
|
||||||
|
bResultm=lpfModule32Next(hSnapShotm,&modentry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Keep looking
|
||||||
|
CloseHandle(hSnapShotm);
|
||||||
|
procentry.dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
bResult = lpfProcess32Next(hSnapShot,&procentry);
|
||||||
|
}
|
||||||
|
CloseHandle(hSnapShot);
|
||||||
|
}
|
||||||
|
if(iFound==0)
|
||||||
|
{
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 603;
|
||||||
|
}
|
||||||
|
FreeLibrary(hInstLib);
|
||||||
|
return 0;
|
||||||
|
}
|
57
lib/afc9.f90
Normal file
57
lib/afc9.f90
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
subroutine afc9(cx,npts,nfast,fsample,nflip,ipol,xpol, &
|
||||||
|
ndphi,iloop,a,ccfbest,dtbest)
|
||||||
|
|
||||||
|
logical xpol
|
||||||
|
complex cx(npts)
|
||||||
|
real a(3),deltaa(3)
|
||||||
|
|
||||||
|
a(1)=0. !f0
|
||||||
|
a(2)=0. !f1
|
||||||
|
a(3)=0. !f2
|
||||||
|
deltaa(1)=2.0
|
||||||
|
deltaa(2)=2.0
|
||||||
|
deltaa(3)=2.0
|
||||||
|
nterms=3
|
||||||
|
|
||||||
|
! Start the iteration
|
||||||
|
chisqr=0.
|
||||||
|
chisqr0=1.e6
|
||||||
|
do iter=1,3 !One iteration is enough?
|
||||||
|
do j=1,nterms
|
||||||
|
chisq1=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
|
fn=0.
|
||||||
|
delta=deltaa(j)
|
||||||
|
10 a(j)=a(j)+delta
|
||||||
|
chisq2=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
|
if(chisq2.eq.chisq1) go to 10
|
||||||
|
if(chisq2.gt.chisq1) then
|
||||||
|
delta=-delta !Reverse direction
|
||||||
|
a(j)=a(j)+delta
|
||||||
|
tmp=chisq1
|
||||||
|
chisq1=chisq2
|
||||||
|
chisq2=tmp
|
||||||
|
endif
|
||||||
|
20 fn=fn+1.0
|
||||||
|
a(j)=a(j)+delta
|
||||||
|
chisq3=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
|
if(chisq3.lt.chisq2) then
|
||||||
|
chisq1=chisq2
|
||||||
|
chisq2=chisq3
|
||||||
|
go to 20
|
||||||
|
endif
|
||||||
|
|
||||||
|
! Find minimum of parabola defined by last three points
|
||||||
|
delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5)
|
||||||
|
a(j)=a(j)-delta
|
||||||
|
deltaa(j)=deltaa(j)*fn/3.
|
||||||
|
enddo
|
||||||
|
chisqr=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
|
if(chisqr/chisqr0.gt.0.9999) go to 30
|
||||||
|
chisqr0=chisqr
|
||||||
|
enddo
|
||||||
|
|
||||||
|
30 ccfbest=ccfmax * (1378.125/fsample)**2
|
||||||
|
dtbest=dtmax
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine afc9
|
@ -1,26 +1,32 @@
|
|||||||
subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
|
subroutine decoder(ss,c0)
|
||||||
|
|
||||||
! Decoder for JT9.
|
! Decoder for JT9.
|
||||||
|
|
||||||
parameter (NMAX=1800*12000) !Total sample intervals per 30 minutes
|
parameter (NMAX=1800*12000) !Total sample intervals per 30 minutes
|
||||||
parameter (NDMAX=1800*1500) !Sample intervals at 1500 Hz rate
|
parameter (NDMAX=1800*1500) !Sample intervals at 1500 Hz rate
|
||||||
parameter (NSMAX=22000) !Max length of saved spectra
|
parameter (NSMAX=22000) !Max length of saved spectra
|
||||||
|
real ss(184,NSMAX)
|
||||||
character*22 msg
|
character*22 msg
|
||||||
character*33 line
|
character*33 line
|
||||||
character*80 fmt,fmt14
|
character*80 fmt,fmt14
|
||||||
|
character*20 datetime
|
||||||
real*4 ccfred(NSMAX)
|
real*4 ccfred(NSMAX)
|
||||||
integer*1 i1SoftSymbols(207)
|
integer*1 i1SoftSymbols(207)
|
||||||
integer*2 id2
|
integer*2 id2
|
||||||
integer ii(1)
|
integer ii(1)
|
||||||
complex c0(NDMAX),c00(NDMAX)
|
complex c0(NDMAX)
|
||||||
common/jt9com/ss0(184,NSMAX),savg(NSMAX),id2(NMAX),nutc0,ndiskdat, &
|
! common/jt9com/ss0(184,NSMAX),savg(NSMAX),id2(NMAX),nutc0,ndiskdat, &
|
||||||
ntr,nfqso,newdat,npts80,nfb,ntol,kin,nzhsym,nsynced,ndecoded
|
! ntr,nfqso,newdat,npts80,nfb,ntol,kin,nzhsym,nsynced,ndecoded
|
||||||
common/jt9comB/ss(184,NSMAX),c0
|
! common/jt9comB/ss(184,NSMAX),c0
|
||||||
|
common/npar/nutc,ndiskdat,ntrperiod,nfqso,newdat,npts8,nfa,nfb,ntol, &
|
||||||
|
kin,nzhsym,nsave,nagain,ndepth,nrxlog,nfsample,datetime
|
||||||
common/tracer/limtrace,lu
|
common/tracer/limtrace,lu
|
||||||
logical first
|
logical first
|
||||||
data first/.true./
|
data first/.true./
|
||||||
save
|
save
|
||||||
|
|
||||||
|
call timer('decoder ',0)
|
||||||
|
|
||||||
if(first) then
|
if(first) then
|
||||||
limtrace=0
|
limtrace=0
|
||||||
lu=12
|
lu=12
|
||||||
@ -29,16 +35,14 @@ subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
|
|||||||
first=.false.
|
first=.false.
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call timer('decoder ',0)
|
! if(newdat.ne.0) then
|
||||||
|
! ss=ss0
|
||||||
|
! c0=c00
|
||||||
|
! nutc=nutc0
|
||||||
|
! npts8=npts80
|
||||||
|
! endif
|
||||||
|
|
||||||
if(newdat.ne.0) then
|
ntrMinutes=ntrperiod/60
|
||||||
ss=ss0
|
|
||||||
c0=c00
|
|
||||||
nutc=nutc0
|
|
||||||
npts8=npts80
|
|
||||||
endif
|
|
||||||
|
|
||||||
ntrMinutes=ntrSeconds/60
|
|
||||||
newdat=1
|
newdat=1
|
||||||
nsynced=0
|
nsynced=0
|
||||||
ndecoded=0
|
ndecoded=0
|
||||||
@ -82,8 +86,8 @@ subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
|
|||||||
call sync9(ss,nzhsym,tstep,df3,ntol,nfqso,ccfred,ia,ib,ipk) !Compute ccfred
|
call sync9(ss,nzhsym,tstep,df3,ntol,nfqso,ccfred,ia,ib,ipk) !Compute ccfred
|
||||||
call timer('sync9 ',1)
|
call timer('sync9 ',1)
|
||||||
|
|
||||||
open(13,file='decoded.txt',status='unknown')
|
! open(13,file='decoded.txt',status='unknown')
|
||||||
rewind 13
|
! rewind 13
|
||||||
if(iand(nRxLog,2).ne.0) rewind 14
|
if(iand(nRxLog,2).ne.0) rewind 14
|
||||||
if(iand(nRxLog,1).ne.0) then
|
if(iand(nRxLog,1).ne.0) then
|
||||||
! Write date and time to lu 14
|
! Write date and time to lu 14
|
||||||
@ -120,7 +124,7 @@ subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if(msg.ne.' ') then
|
if(msg.ne.' ') then
|
||||||
write(13,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg
|
write(*,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg
|
||||||
write(14,fmt14) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,nlim,msg
|
write(14,fmt14) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,nlim,msg
|
||||||
fgood=f
|
fgood=f
|
||||||
nsynced=1
|
nsynced=1
|
||||||
@ -132,17 +136,20 @@ subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
|
|||||||
if(maxval(ccfred(ia:ib)).gt.3.0) go to 10
|
if(maxval(ccfred(ia:ib)).gt.3.0) go to 10
|
||||||
|
|
||||||
if(fgood.eq.0.0) then
|
if(fgood.eq.0.0) then
|
||||||
write(13,1020) line
|
write(*,1020) line
|
||||||
write(14,1020) line
|
write(14,1020) line
|
||||||
1020 format(a33)
|
1020 format(a33)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call flush(13)
|
write(*,1010) nsum,nsave
|
||||||
|
1010 format('<DecodeFinished>',2i4)
|
||||||
|
flush(6)
|
||||||
|
|
||||||
|
call flush(6)
|
||||||
call flush(14)
|
call flush(14)
|
||||||
close(13)
|
|
||||||
|
|
||||||
call timer('decoder ',1)
|
call timer('decoder ',1)
|
||||||
call timer('decoder ',101)
|
if(nstandalone.eq.0) call timer('decoder ',101)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine decoder
|
end subroutine decoder
|
||||||
|
69
lib/fchisq.f90
Normal file
69
lib/fchisq.f90
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
real function fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
|
|
||||||
|
parameter (NMAX=60*96000) !Samples per 60 s
|
||||||
|
complex cx(npts)
|
||||||
|
real a(3)
|
||||||
|
complex w,wstep,za,zb,z
|
||||||
|
real ss(3000)
|
||||||
|
complex csx(0:NMAX/64)
|
||||||
|
data twopi/6.283185307/a1,a2,a3/99.,99.,99./
|
||||||
|
save
|
||||||
|
|
||||||
|
call timer('fchisq ',0)
|
||||||
|
baud=nfast*11025.0/4096.0
|
||||||
|
nsps=nint(fsample/baud) !Samples per symbol
|
||||||
|
nsph=nsps/2 !Samples per half-symbol
|
||||||
|
ndiv=16 !Output ss() steps per symbol
|
||||||
|
nout=ndiv*npts/nsps
|
||||||
|
dtstep=1.0/(ndiv*baud) !Time per output step
|
||||||
|
|
||||||
|
if(a(1).ne.a1 .or. a(2).ne.a2 .or. a(3).ne.a3) then
|
||||||
|
a1=a(1)
|
||||||
|
a2=a(2)
|
||||||
|
a3=a(3)
|
||||||
|
|
||||||
|
! Mix and integrate the complex signal
|
||||||
|
csx(0)=0.
|
||||||
|
w=1.0
|
||||||
|
x0=0.5*(npts+1)
|
||||||
|
s=2.0/npts
|
||||||
|
do i=1,npts
|
||||||
|
x=s*(i-x0)
|
||||||
|
if(mod(i,100).eq.1) then
|
||||||
|
p2=1.5*x*x - 0.5
|
||||||
|
! p3=2.5*(x**3) - 1.5*x
|
||||||
|
! p4=4.375*(x**4) - 3.75*(x**2) + 0.375
|
||||||
|
dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample)
|
||||||
|
wstep=cmplx(cos(dphi),sin(dphi))
|
||||||
|
endif
|
||||||
|
w=w*wstep
|
||||||
|
csx(i)=csx(i-1) + w*cx(i)
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
|
||||||
|
! Compute 1/2-symbol powers at 1/16-symbol steps.
|
||||||
|
fac=1.e-4
|
||||||
|
|
||||||
|
do i=1,nout
|
||||||
|
j=i*nsps/ndiv
|
||||||
|
k=j-nsph
|
||||||
|
ss(i)=0.
|
||||||
|
if(k.ge.1) then
|
||||||
|
za=csx(j)-csx(k)
|
||||||
|
ss(i)=fac*(real(za)**2 + aimag(za)**2)
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
ccfmax=0.
|
||||||
|
call timer('ccf2 ',0)
|
||||||
|
call ccf2(ss,nout,nflip,ccf,lagpk)
|
||||||
|
call timer('ccf2 ',1)
|
||||||
|
if(ccf.gt.ccfmax) then
|
||||||
|
ccfmax=ccf
|
||||||
|
dtmax=lagpk*dtstep
|
||||||
|
endif
|
||||||
|
fchisq=-ccfmax
|
||||||
|
|
||||||
|
call timer('fchisq ',1)
|
||||||
|
return
|
||||||
|
end function fchisq
|
@ -2,33 +2,33 @@
|
|||||||
#include <qsharedmemory.h>
|
#include <qsharedmemory.h>
|
||||||
#include <QSystemSemaphore>
|
#include <QSystemSemaphore>
|
||||||
|
|
||||||
QSharedMemory mem_m65("mem_m65");
|
QSharedMemory mem_jt9("mem_jt9");
|
||||||
QSystemSemaphore sem_m65("sem_m65", 1, QSystemSemaphore::Open);
|
QSystemSemaphore sem_jt9("sem_jt9", 1, QSystemSemaphore::Open);
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
bool attach_m65_();
|
bool attach_jt9_();
|
||||||
bool create_m65_(int nsize);
|
bool create_jt9_(int nsize);
|
||||||
bool detach_m65_();
|
bool detach_jt9_();
|
||||||
bool lock_m65_();
|
bool lock_jt9_();
|
||||||
bool unlock_m65_();
|
bool unlock_jt9_();
|
||||||
char* address_m65_();
|
char* address_jt9_();
|
||||||
int size_m65_();
|
int size_jt9_();
|
||||||
|
|
||||||
bool acquire_m65_();
|
bool acquire_jt9_();
|
||||||
bool release_m65_();
|
bool release_jt9_();
|
||||||
|
|
||||||
extern struct {
|
extern struct {
|
||||||
char c[10];
|
char c[10];
|
||||||
} m65com_;
|
} jt9com_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool attach_m65_() {return mem_m65.attach();}
|
bool attach_jt9_() {return mem_jt9.attach();}
|
||||||
bool create_m65_(int nsize) {return mem_m65.create(nsize);}
|
bool create_jt9_(int nsize) {return mem_jt9.create(nsize);}
|
||||||
bool detach_m65_() {return mem_m65.detach();}
|
bool detach_jt9_() {return mem_jt9.detach();}
|
||||||
bool lock_m65_() {return mem_m65.lock();}
|
bool lock_jt9_() {return mem_jt9.lock();}
|
||||||
bool unlock_m65_() {return mem_m65.unlock();}
|
bool unlock_jt9_() {return mem_jt9.unlock();}
|
||||||
char* address_m65_() {return (char*)mem_m65.constData();}
|
char* address_jt9_() {return (char*)mem_jt9.constData();}
|
||||||
int size_m65_() {return (int)mem_m65.size();}
|
int size_jt9_() {return (int)mem_jt9.size();}
|
||||||
|
|
||||||
bool acquire_m65_() {return sem_m65.acquire();}
|
bool acquire_jt9_() {return sem_jt9.acquire();}
|
||||||
bool release_m65_() {return sem_m65.release();}
|
bool release_jt9_() {return sem_jt9.release();}
|
||||||
|
44
lib/jt9.f90
44
lib/jt9.f90
@ -17,9 +17,9 @@ program jt9
|
|||||||
character*22 msg
|
character*22 msg
|
||||||
character*33 line
|
character*33 line
|
||||||
integer*2 id2
|
integer*2 id2
|
||||||
complex c0(NDMAX)
|
complex c0
|
||||||
common/jt9com/ss(184,NSMAX),savg(NSMAX),id2(NMAX),nutc,ndiskdat, &
|
common/jt9com/ss(184,NSMAX),savg(NSMAX),c0(NDMAX),id2(NMAX),nutc,ndiskdat, &
|
||||||
ntr,mousefqso,newdat,nfa,nfb,ntol,kin
|
ntr,mousefqso,newdat,nfa,nfb,ntol,kin,nzhsym,nsynced,ndecoded
|
||||||
|
|
||||||
nargs=iargc()
|
nargs=iargc()
|
||||||
if(nargs.lt.1) then
|
if(nargs.lt.1) then
|
||||||
@ -31,7 +31,11 @@ program jt9
|
|||||||
go to 999
|
go to 999
|
||||||
endif
|
endif
|
||||||
call getarg(1,arg)
|
call getarg(1,arg)
|
||||||
if(arg(1:2).eq.'-s') go to 999
|
if(arg(1:2).eq.'-s') then
|
||||||
|
call jt9a
|
||||||
|
! call ftnquit
|
||||||
|
go to 999
|
||||||
|
endif
|
||||||
read(arg,*) ntrperiod
|
read(arg,*) ntrperiod
|
||||||
|
|
||||||
ifile1=2
|
ifile1=2
|
||||||
@ -56,11 +60,22 @@ program jt9
|
|||||||
go to 2
|
go to 2
|
||||||
1 nutc0=0
|
1 nutc0=0
|
||||||
2 nsps=0
|
2 nsps=0
|
||||||
if(ntrperiod.eq.1) nsps=6912
|
if(ntrperiod.eq.1) then
|
||||||
if(ntrperiod.eq.2) nsps=15360
|
nsps=6912
|
||||||
if(ntrperiod.eq.5) nsps=40960
|
nzhsym=181
|
||||||
if(ntrperiod.eq.10) nsps=82944
|
else if(ntrperiod.eq.2) then
|
||||||
if(ntrperiod.eq.30) nsps=252000
|
nsps=15360
|
||||||
|
nzhsym=178
|
||||||
|
else if(ntrperiod.eq.5) then
|
||||||
|
nsps=40960
|
||||||
|
nzhsym=172
|
||||||
|
else if(ntrperiod.eq.10) then
|
||||||
|
nsps=82944
|
||||||
|
nzhsym=171
|
||||||
|
else if(ntrperiod.eq.30) then
|
||||||
|
nsps=252000
|
||||||
|
nzhsym=167
|
||||||
|
endif
|
||||||
if(nsps.eq.0) stop 'Error: bad TRperiod'
|
if(nsps.eq.0) stop 'Error: bad TRperiod'
|
||||||
|
|
||||||
kstep=nsps/2
|
kstep=nsps/2
|
||||||
@ -68,6 +83,7 @@ program jt9
|
|||||||
k=0
|
k=0
|
||||||
nhsym0=-999
|
nhsym0=-999
|
||||||
npts=(60*ntrperiod-6)*12000
|
npts=(60*ntrperiod-6)*12000
|
||||||
|
if(ifile.eq.ifile1) call timer('jt9 ',0)
|
||||||
|
|
||||||
! do i=1,npts
|
! do i=1,npts
|
||||||
! id2(i)=100.0*sin(6.283185307*1600.0*i/12000.0)
|
! id2(i)=100.0*sin(6.283185307*1600.0*i/12000.0)
|
||||||
@ -75,13 +91,18 @@ program jt9
|
|||||||
|
|
||||||
do iblk=1,npts/kstep
|
do iblk=1,npts/kstep
|
||||||
k=iblk*kstep
|
k=iblk*kstep
|
||||||
|
call timer('read_wav',0)
|
||||||
read(10,end=10) id2(k-kstep+1:k)
|
read(10,end=10) id2(k-kstep+1:k)
|
||||||
|
call timer('read_wav',1)
|
||||||
|
|
||||||
nhsym=(k-2048)/kstep
|
nhsym=(k-2048)/kstep
|
||||||
if(nhsym.ge.1 .and. nhsym.ne.nhsym0) then
|
if(nhsym.ge.1 .and. nhsym.ne.nhsym0) then
|
||||||
! Emit signal readyForFFT
|
! Emit signal readyForFFT
|
||||||
ingain=0
|
ingain=0
|
||||||
|
call timer('symspec ',0)
|
||||||
call symspec(k,ntrperiod,nsps,ingain,nb,nbslider,pxdb, &
|
call symspec(k,ntrperiod,nsps,ingain,nb,nbslider,pxdb, &
|
||||||
s,ccfred,df3,ihsym,nzap,slimit,lstrong,c0,npts8)
|
s,ccfred,df3,ihsym,nzap,slimit,lstrong,c0,npts8)
|
||||||
|
call timer('symspec ',1)
|
||||||
nhsym0=nhsym
|
nhsym0=nhsym
|
||||||
if(ihsym.ge.184) go to 10
|
if(ihsym.ge.184) go to 10
|
||||||
endif
|
endif
|
||||||
@ -91,7 +112,7 @@ program jt9
|
|||||||
iz=1000.0/df3
|
iz=1000.0/df3
|
||||||
nutc=nutc0
|
nutc=nutc0
|
||||||
|
|
||||||
call sync9(ss,tstep,df3,ntol,nfqso,ccfred,ia,ib,ipk) !Get sync, freq
|
call sync9(ss,nzhsym,tstep,df3,ntol,nfqso,ccfred,ia,ib,ipk) !Get sync, freq
|
||||||
|
|
||||||
fgood=0.
|
fgood=0.
|
||||||
df8=1500.0/(nsps/8)
|
df8=1500.0/(nsps/8)
|
||||||
@ -132,6 +153,9 @@ program jt9
|
|||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
call timer('jt9 ',1)
|
||||||
|
call timer('jt9 ',101)
|
||||||
|
! call ftnquit
|
||||||
go to 999
|
go to 999
|
||||||
|
|
||||||
998 print*,'Cannot open file:'
|
998 print*,'Cannot open file:'
|
||||||
|
100
lib/jt9a.F90
Normal file
100
lib/jt9a.F90
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
subroutine jt9a
|
||||||
|
|
||||||
|
! NB: this interface block is required by g95, but must be omitted
|
||||||
|
! for gfortran. (????)
|
||||||
|
|
||||||
|
#ifndef UNIX
|
||||||
|
interface
|
||||||
|
function address_jt9()
|
||||||
|
end function address_jt9
|
||||||
|
end interface
|
||||||
|
#endif
|
||||||
|
|
||||||
|
integer*1 attach_jt9,lock_jt9,unlock_jt9
|
||||||
|
integer size_jt9
|
||||||
|
integer*1, pointer :: address_jt9,p_jt9
|
||||||
|
character*80 cwd
|
||||||
|
logical fileExists
|
||||||
|
common/tracer/limtrace,lu
|
||||||
|
|
||||||
|
call getcwd(cwd)
|
||||||
|
! call ftninit(trim(cwd))
|
||||||
|
|
||||||
|
limtrace=0
|
||||||
|
lu=12
|
||||||
|
i1=attach_jt9()
|
||||||
|
|
||||||
|
10 inquire(file=trim(cwd)//'/.lock',exist=fileExists)
|
||||||
|
if(fileExists) then
|
||||||
|
call sleep_msec(100)
|
||||||
|
go to 10
|
||||||
|
endif
|
||||||
|
|
||||||
|
inquire(file=trim(cwd)//'/.quit',exist=fileExists)
|
||||||
|
if(fileExists) then
|
||||||
|
! call ftnquit
|
||||||
|
i=detach_jt9()
|
||||||
|
go to 999
|
||||||
|
endif
|
||||||
|
|
||||||
|
nbytes=size_jt9()
|
||||||
|
if(nbytes.le.0) then
|
||||||
|
print*,'jt9a: Shared memory mem_jt9 does not exist.'
|
||||||
|
print*,"Must start 'jt9 -s' from within WSJT-X."
|
||||||
|
go to 999
|
||||||
|
endif
|
||||||
|
p_jt9=>address_jt9()
|
||||||
|
call jt9b(p_jt9,nbytes)
|
||||||
|
|
||||||
|
! write(*,1010)
|
||||||
|
!1010 format('<jt9aFinished>')
|
||||||
|
! flush(6)
|
||||||
|
|
||||||
|
100 inquire(file=trim(cwd)//'/.lock',exist=fileExists)
|
||||||
|
if(fileExists) go to 10
|
||||||
|
call sleep_msec(100)
|
||||||
|
go to 100
|
||||||
|
|
||||||
|
999 return
|
||||||
|
end subroutine jt9a
|
||||||
|
|
||||||
|
subroutine jt9b(jt9com,nbytes)
|
||||||
|
integer*1 jt9com(0:nbytes-1)
|
||||||
|
kss=0
|
||||||
|
ksavg=kss + 4*184*22000
|
||||||
|
kc0=ksavg + 4*22000
|
||||||
|
kid2=kc0 + 2*4*1800*1500
|
||||||
|
knutc=kid2 + 2*1800*12000
|
||||||
|
call jt9c(jt9com(kss),jt9com(ksavg),jt9com(kc0),jt9com(kid2),jt9com(knutc))
|
||||||
|
return
|
||||||
|
end subroutine jt9b
|
||||||
|
|
||||||
|
subroutine jt9c(ss,savg,c0,id2,nparams0)
|
||||||
|
parameter (NSMAX=22000)
|
||||||
|
integer*1 detach_jt9
|
||||||
|
real*4 ss(184*NSMAX),savg(NSMAX)
|
||||||
|
complex c0(1800*1500)
|
||||||
|
integer*2 id2(1800*12000)
|
||||||
|
|
||||||
|
integer nparams0(21),nparams(21)
|
||||||
|
character*20 datetime
|
||||||
|
common/npar/nutc,ndiskdat,ntrperiod,nfqso,newdat,npts8,nfa,nfb,ntol, &
|
||||||
|
kin,nzhsym,nsave,nagain,ndepth,nrxlog,nfsample,datetime
|
||||||
|
equivalence (nparams,nutc)
|
||||||
|
|
||||||
|
nparams=nparams0 !Copy parameters into common/npar/
|
||||||
|
npatience=1
|
||||||
|
|
||||||
|
if(iand(nrxlog,1).ne.0) then
|
||||||
|
! write(21,1000) datetime(:17)
|
||||||
|
!1000 format(/'UTC Date: 'a17/78('-'))
|
||||||
|
! flush(21)
|
||||||
|
endif
|
||||||
|
! if(iand(nrxlog,2).ne.0) rewind 21
|
||||||
|
! if(iand(nrxlog,4).ne.0) rewind 26
|
||||||
|
|
||||||
|
nstandalone=0
|
||||||
|
if(sum(nparams).ne.0) call decoder(ss,c0,ntrperiod,ndepth,nrxlog)
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine jt9c
|
97
lib/jt9a.f90
97
lib/jt9a.f90
@ -1,97 +0,0 @@
|
|||||||
subroutine m65a
|
|
||||||
|
|
||||||
! NB: this interface block is required by g95, but must be omitted
|
|
||||||
! for gfortran. (????)
|
|
||||||
|
|
||||||
#ifndef UNIX
|
|
||||||
interface
|
|
||||||
function address_m65()
|
|
||||||
end function address_m65
|
|
||||||
end interface
|
|
||||||
#endif
|
|
||||||
|
|
||||||
integer*1 attach_m65,lock_m65,unlock_m65
|
|
||||||
integer size_m65
|
|
||||||
integer*1, pointer :: address_m65,p_m65
|
|
||||||
character*80 cwd
|
|
||||||
logical fileExists
|
|
||||||
common/tracer/limtrace,lu
|
|
||||||
|
|
||||||
call getcwd(cwd)
|
|
||||||
call ftninit(trim(cwd))
|
|
||||||
limtrace=0
|
|
||||||
lu=12
|
|
||||||
i1=attach_m65()
|
|
||||||
|
|
||||||
10 inquire(file=trim(cwd)//'/.lock',exist=fileExists)
|
|
||||||
if(fileExists) then
|
|
||||||
call sleep_msec(100)
|
|
||||||
go to 10
|
|
||||||
endif
|
|
||||||
|
|
||||||
inquire(file=trim(cwd)//'/.quit',exist=fileExists)
|
|
||||||
if(fileExists) then
|
|
||||||
call ftnquit
|
|
||||||
i=detach_m65()
|
|
||||||
go to 999
|
|
||||||
endif
|
|
||||||
|
|
||||||
nbytes=size_m65()
|
|
||||||
if(nbytes.le.0) then
|
|
||||||
print*,'m65a: Shared memory mem_m65 does not exist.'
|
|
||||||
print*,'Program m65a should be started automatically from within map65.'
|
|
||||||
go to 999
|
|
||||||
endif
|
|
||||||
p_m65=>address_m65()
|
|
||||||
call m65b(p_m65,nbytes)
|
|
||||||
|
|
||||||
write(*,1010)
|
|
||||||
1010 format('<m65aFinished>')
|
|
||||||
flush(6)
|
|
||||||
|
|
||||||
100 inquire(file=trim(cwd)//'/.lock',exist=fileExists)
|
|
||||||
if(fileExists) go to 10
|
|
||||||
call sleep_msec(100)
|
|
||||||
go to 100
|
|
||||||
|
|
||||||
999 return
|
|
||||||
end subroutine m65a
|
|
||||||
|
|
||||||
subroutine m65b(m65com,nbytes)
|
|
||||||
integer*1 m65com(0:nbytes-1)
|
|
||||||
kss=4*4*60*96000
|
|
||||||
ksavg=kss+4*4*322*32768
|
|
||||||
kfcenter=ksavg+4*4*32768
|
|
||||||
call m65c(m65com(0),m65com(kss),m65com(ksavg),m65com(kfcenter))
|
|
||||||
return
|
|
||||||
end subroutine m65b
|
|
||||||
|
|
||||||
subroutine m65c(dd,ss,savg,nparams0)
|
|
||||||
integer*1 detach_m65
|
|
||||||
real*4 dd(4,5760000),ss(4,322,32768),savg(4,32768)
|
|
||||||
real*8 fcenter
|
|
||||||
integer nparams0(37),nparams(37)
|
|
||||||
character*12 mycall,hiscall
|
|
||||||
character*6 mygrid,hisgrid
|
|
||||||
character*20 datetime
|
|
||||||
common/npar/fcenter,nutc,idphi,mousedf,mousefqso, &
|
|
||||||
ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, &
|
|
||||||
mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,mode65, &
|
|
||||||
mycall,mygrid,hiscall,hisgrid,datetime
|
|
||||||
equivalence (nparams,fcenter)
|
|
||||||
|
|
||||||
nparams=nparams0 !Copy parameters into common/npar/
|
|
||||||
npatience=1
|
|
||||||
if(iand(nrxlog,1).ne.0) then
|
|
||||||
write(21,1000) datetime(:17)
|
|
||||||
1000 format(/'UTC Date: 'a17/78('-'))
|
|
||||||
flush(21)
|
|
||||||
endif
|
|
||||||
if(iand(nrxlog,2).ne.0) rewind 21
|
|
||||||
if(iand(nrxlog,4).ne.0) rewind 26
|
|
||||||
|
|
||||||
nstandalone=0
|
|
||||||
if(sum(nparams).ne.0) call decode0(dd,ss,savg,nstandalone)
|
|
||||||
|
|
||||||
return
|
|
||||||
end subroutine m65c
|
|
@ -1,5 +1,5 @@
|
|||||||
subroutine symspec(k,ntrperiod,nsps,ingain,nb,nbslider,pxdb,s,red, &
|
subroutine symspec(k,ntrperiod,nsps,ingain,nb,nbslider,pxdb,s,red, &
|
||||||
df3,ihsym,nzap,slimit,lstrong,c0,npts8)
|
df3,ihsym,nzap,slimit,lstrong,npts8)
|
||||||
|
|
||||||
! Input:
|
! Input:
|
||||||
! k pointer to the most recent new data
|
! k pointer to the most recent new data
|
||||||
@ -31,8 +31,8 @@ subroutine symspec(k,ntrperiod,nsps,ingain,nb,nbslider,pxdb,s,red, &
|
|||||||
complex cx(0:MAXFFT3-1)
|
complex cx(0:MAXFFT3-1)
|
||||||
logical*1 lstrong(0:1023) !Should be (0:512)
|
logical*1 lstrong(0:1023) !Should be (0:512)
|
||||||
integer*2 id2
|
integer*2 id2
|
||||||
complex c0(NDMAX)
|
complex c0
|
||||||
common/jt9com/ss(184,NSMAX),savg(NSMAX),id2(NMAX),nutc,ndiskdat, &
|
common/jt9com/ss(184,NSMAX),savg(NSMAX),c0(NDMAX),id2(NMAX),nutc,ndiskdat, &
|
||||||
ntr,mousefqso,newdat,nfa,nfb,ntol,kin,nzhsym,nsynced,ndecoded
|
ntr,mousefqso,newdat,nfa,nfb,ntol,kin,nzhsym,nsynced,ndecoded
|
||||||
data rms/999.0/,k0/99999999/,ntrperiod0/0/,nfft3z/0/
|
data rms/999.0/,k0/99999999/,ntrperiod0/0/,nfft3z/0/
|
||||||
save
|
save
|
||||||
|
120
mainwindow.cpp
120
mainwindow.cpp
@ -12,7 +12,7 @@
|
|||||||
int itone[85]; //Tx audio tones for 85 symbols
|
int itone[85]; //Tx audio tones for 85 symbols
|
||||||
bool btxok; //True if OK to transmit
|
bool btxok; //True if OK to transmit
|
||||||
double outputLatency; //Latency in seconds
|
double outputLatency; //Latency in seconds
|
||||||
float c0[2*1800*1500];
|
//float c0[2*1800*1500];
|
||||||
|
|
||||||
WideGraph* g_pWideGraph = NULL;
|
WideGraph* g_pWideGraph = NULL;
|
||||||
QSharedMemory mem_jt9("mem_jt9");
|
QSharedMemory mem_jt9("mem_jt9");
|
||||||
@ -29,7 +29,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
freopen("wsjtx.log","w",stderr);
|
// freopen("wsjtx.log","w",stderr);
|
||||||
#endif
|
#endif
|
||||||
on_EraseButton_clicked();
|
on_EraseButton_clicked();
|
||||||
ui->labUTC->setStyleSheet( \
|
ui->labUTC->setStyleSheet( \
|
||||||
@ -147,11 +147,11 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
msgBox("Unable to initialize PortAudio.");
|
msgBox("Unable to initialize PortAudio.");
|
||||||
}
|
}
|
||||||
readSettings(); //Restore user's setup params
|
readSettings(); //Restore user's setup params
|
||||||
QFile lockFile(m_appDir + "/.lock"); //Create .lock so m65 will wait
|
QFile lockFile(m_appDir + "/.lock"); //Create .lock so jt9 will wait
|
||||||
lockFile.open(QIODevice::ReadWrite);
|
lockFile.open(QIODevice::ReadWrite);
|
||||||
QFile quitFile(m_appDir + "/.lock");
|
QFile quitFile(m_appDir + "/.lock");
|
||||||
quitFile.remove();
|
quitFile.remove();
|
||||||
// proc_jt9.start(QDir::toNativeSeparators(m_appDir + "/jt9 -s"));
|
proc_jt9.start(QDir::toNativeSeparators(m_appDir + "/jt9 -s"));
|
||||||
|
|
||||||
m_pbdecoding_style1="QPushButton{background-color: cyan; \
|
m_pbdecoding_style1="QPushButton{background-color: cyan; \
|
||||||
border-style: outset; border-width: 1px; border-radius: 5px; \
|
border-style: outset; border-width: 1px; border-radius: 5px; \
|
||||||
@ -374,7 +374,7 @@ void MainWindow::dataSink(int k)
|
|||||||
if(m_NB) nb=1;
|
if(m_NB) nb=1;
|
||||||
trmin=m_TRperiod/60;
|
trmin=m_TRperiod/60;
|
||||||
symspec_(&k, &trmin, &m_nsps, &m_inGain, &nb, &m_NBslider, &px, s, red,
|
symspec_(&k, &trmin, &m_nsps, &m_inGain, &nb, &m_NBslider, &px, s, red,
|
||||||
&df3, &ihsym, &nzap, &slimit, lstrong, c0, &npts8);
|
&df3, &ihsym, &nzap, &slimit, lstrong, &npts8);
|
||||||
if(ihsym <=0) return;
|
if(ihsym <=0) return;
|
||||||
QString t;
|
QString t;
|
||||||
m_pctZap=nzap*100.0/m_nsps;
|
m_pctZap=nzap*100.0/m_nsps;
|
||||||
@ -393,9 +393,7 @@ void MainWindow::dataSink(int k)
|
|||||||
QDateTime t = QDateTime::currentDateTimeUtc();
|
QDateTime t = QDateTime::currentDateTimeUtc();
|
||||||
m_dateTime=t.toString("yyyy-MMM-dd hh:mm");
|
m_dateTime=t.toString("yyyy-MMM-dd hh:mm");
|
||||||
decode(); //Start the decoder
|
decode(); //Start the decoder
|
||||||
if(!m_diskData and
|
if(!m_diskData and m_saveAll) {
|
||||||
(m_saveAll or (m_saveSynced and (jt9com_.nsynced==1))
|
|
||||||
or (m_saveDecoded and (jt9com_.ndecoded==1)))) {
|
|
||||||
int ihr=t.time().toString("hh").toInt();
|
int ihr=t.time().toString("hh").toInt();
|
||||||
int imin=t.time().toString("mm").toInt();
|
int imin=t.time().toString("mm").toInt();
|
||||||
imin=imin - (imin%(m_TRperiod/60));
|
imin=imin - (imin%(m_TRperiod/60));
|
||||||
@ -627,7 +625,7 @@ void MainWindow::OnExit()
|
|||||||
QFile quitFile(m_appDir + "/.quit");
|
QFile quitFile(m_appDir + "/.quit");
|
||||||
quitFile.open(QIODevice::ReadWrite);
|
quitFile.open(QIODevice::ReadWrite);
|
||||||
QFile lockFile(m_appDir + "/.lock");
|
QFile lockFile(m_appDir + "/.lock");
|
||||||
lockFile.remove(); // Allow m65 to terminate
|
lockFile.remove(); // Allow jt9 to terminate
|
||||||
bool b=proc_jt9.waitForFinished(1000);
|
bool b=proc_jt9.waitForFinished(1000);
|
||||||
if(!b) proc_jt9.kill();
|
if(!b) proc_jt9.kill();
|
||||||
quitFile.remove();
|
quitFile.remove();
|
||||||
@ -868,7 +866,7 @@ void MainWindow::freezeDecode(int n) //freezeDecode()
|
|||||||
decode();
|
decode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
void MainWindow::decode() //decode()
|
void MainWindow::decode() //decode()
|
||||||
{
|
{
|
||||||
if(!m_dataAvailable) return;
|
if(!m_dataAvailable) return;
|
||||||
@ -893,97 +891,66 @@ void MainWindow::decode() //decode()
|
|||||||
&m_RxLog, &c0[0]);
|
&m_RxLog, &c0[0]);
|
||||||
watcher3->setFuture(*future3);
|
watcher3->setFuture(*future3);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
void MainWindow::decode() //decode()
|
void MainWindow::decode() //decode()
|
||||||
{
|
{
|
||||||
ui->DecodeButton->setStyleSheet(m_pbdecoding_style1);
|
ui->DecodeButton->setStyleSheet(m_pbdecoding_style1);
|
||||||
if(datcom_.nagain==0 && (!m_diskData)) {
|
if(jt9com_.nagain==0 && (!m_diskData)) {
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
int imin=ms/60000;
|
int imin=ms/60000;
|
||||||
int ihr=imin/60;
|
int ihr=imin/60;
|
||||||
imin=imin % 60;
|
imin=imin % 60;
|
||||||
int isec=(ms/1000) % 60;
|
jt9com_.nutc=100*(100*ihr + imin);
|
||||||
datcom_.nutc=100*(100*ihr + imin);
|
|
||||||
if((m_mode=="JT65B2" or m_mode=="JT65C2") and isec>30) datcom_.nutc += 30;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
datcom_.idphi=m_dPhi;
|
jt9com_.nfqso=g_pWideGraph->QSOfreq();
|
||||||
datcom_.mousedf=g_pWideGraph->DF();
|
jt9com_.ndepth=m_ndepth;
|
||||||
datcom_.mousefqso=g_pWideGraph->QSOfreq();
|
jt9com_.ndiskdat=0;
|
||||||
datcom_.ndepth=m_ndepth;
|
if(m_diskData) jt9com_.ndiskdat=1;
|
||||||
datcom_.ndiskdat=0;
|
|
||||||
if(m_diskData) datcom_.ndiskdat=1;
|
|
||||||
datcom_.neme=0;
|
|
||||||
if(ui->actionOnly_EME_calls->isChecked()) datcom_.neme=1;
|
|
||||||
|
|
||||||
int ispan=int(g_pWideGraph->fSpan());
|
jt9com_.nfa=1000; //### temporary ###
|
||||||
if(ispan%2 == 1) ispan++;
|
jt9com_.nfb=2000;
|
||||||
int ifc=int(1000.0*(datcom_.fcenter - int(datcom_.fcenter))+0.5);
|
|
||||||
int nfa=g_pWideGraph->nStartFreq();
|
|
||||||
int nfb=nfa+ispan;
|
|
||||||
int nfshift=nfa + ispan/2 - ifc;
|
|
||||||
|
|
||||||
datcom_.nfa=nfa;
|
jt9com_.ntol=m_tol;
|
||||||
datcom_.nfb=nfb;
|
if(jt9com_.nutc < m_nutc0) m_RxLog |= 1; //Date and Time to all65.txt
|
||||||
datcom_.nfcal=m_fCal;
|
m_nutc0=jt9com_.nutc;
|
||||||
datcom_.nfshift=nfshift;
|
jt9com_.nrxlog=m_RxLog;
|
||||||
datcom_.mcall3=0;
|
jt9com_.nfsample=12000;
|
||||||
if(m_call3Modified) datcom_.mcall3=1;
|
jt9com_.ntrperiod=m_TRperiod;
|
||||||
datcom_.ntimeout=m_timeout;
|
m_nsave=0;
|
||||||
datcom_.ntol=m_tol;
|
if(m_saveSynced) m_nsave=1;
|
||||||
datcom_.nxant=0;
|
if(m_saveDecoded) m_nsave=2;
|
||||||
if(m_xpolx) datcom_.nxant=1;
|
jt9com_.nsave=m_nsave;
|
||||||
if(datcom_.nutc < m_nutc0) m_map65RxLog |= 1; //Date and Time to all65.txt
|
strncpy(jt9com_.datetime, m_dateTime.toAscii(), 20);
|
||||||
m_nutc0=datcom_.nutc;
|
|
||||||
datcom_.map65RxLog=m_map65RxLog;
|
|
||||||
datcom_.nfsample=96000;
|
|
||||||
if(!m_fs96000) datcom_.nfsample=95238;
|
|
||||||
datcom_.nxpol=0;
|
|
||||||
if(m_xpol) datcom_.nxpol=1;
|
|
||||||
datcom_.mode65=m_mode65;
|
|
||||||
datcom_.nfast=m_nfast;
|
|
||||||
datcom_.nsave=m_nsave;
|
|
||||||
|
|
||||||
QString mcall=(m_myCall+" ").mid(0,12);
|
|
||||||
QString mgrid=(m_myGrid+" ").mid(0,6);
|
|
||||||
QString hcall=(ui->dxCallEntry->text()+" ").mid(0,12);
|
|
||||||
QString hgrid=(ui->dxGridEntry->text()+" ").mid(0,6);
|
|
||||||
|
|
||||||
strncpy(datcom_.mycall, mcall.toAscii(), 12);
|
|
||||||
strncpy(datcom_.mygrid, mgrid.toAscii(), 6);
|
|
||||||
strncpy(datcom_.hiscall, hcall.toAscii(), 12);
|
|
||||||
strncpy(datcom_.hisgrid, hgrid.toAscii(), 6);
|
|
||||||
strncpy(datcom_.datetime, m_dateTime.toAscii(), 20);
|
|
||||||
|
|
||||||
//newdat=1 ==> this is new data, must do the big FFT
|
//newdat=1 ==> this is new data, must do the big FFT
|
||||||
//nagain=1 ==> decode only at fQSO +/- Tol
|
//nagain=1 ==> decode only at fQSO +/- Tol
|
||||||
|
|
||||||
char *to = (char*)mem_m65.data();
|
char *to = (char*)mem_jt9.data();
|
||||||
char *from = (char*) datcom_.d4;
|
char *from = (char*) jt9com_.ss;
|
||||||
int size=sizeof(datcom_);
|
int size=sizeof(jt9com_);
|
||||||
if(datcom_.newdat==0) {
|
/*
|
||||||
|
if(jt9com_.newdat==0) {
|
||||||
int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768;
|
int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768;
|
||||||
to += noffset;
|
to += noffset;
|
||||||
from += noffset;
|
from += noffset;
|
||||||
size -= noffset;
|
size -= noffset;
|
||||||
}
|
}
|
||||||
memcpy(to, from, qMin(mem_m65.size(), size));
|
*/
|
||||||
datcom_.nagain=0;
|
memcpy(to, from, qMin(mem_jt9.size(), size));
|
||||||
datcom_.ndiskdat=0;
|
jt9com_.nagain=0;
|
||||||
m_call3Modified=false;
|
jt9com_.ndiskdat=0;
|
||||||
|
|
||||||
QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start
|
QFile lockFile(m_appDir + "/.lock"); // Allow jt9 to start
|
||||||
lockFile.remove();
|
lockFile.remove();
|
||||||
decodeBusy(true);
|
decodeBusy(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
void MainWindow::jt9_error() //jt9_error
|
||||||
|
|
||||||
void MainWindow::jt9_error() //m65_error
|
|
||||||
{
|
{
|
||||||
if(!m_killAll) {
|
if(!m_killAll) {
|
||||||
msgBox("Error starting or running\n" + m_appDir + "/m65 -s");
|
msgBox("Error starting or running\n" + m_appDir + "/jt9 -s");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1015,11 +982,15 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
lockFile.open(QIODevice::ReadWrite);
|
lockFile.open(QIODevice::ReadWrite);
|
||||||
ui->DecodeButton->setStyleSheet("");
|
ui->DecodeButton->setStyleSheet("");
|
||||||
decodeBusy(false);
|
decodeBusy(false);
|
||||||
// m_map65RxLog=0;
|
m_RxLog=0;
|
||||||
m_startAnother=m_loopall;
|
m_startAnother=m_loopall;
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
int n=t.length();
|
||||||
|
ui->decodedTextBrowser->append(t.mid(0,n-2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
if(t.indexOf("!") >= 0) {
|
if(t.indexOf("!") >= 0) {
|
||||||
int n=t.length();
|
int n=t.length();
|
||||||
if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-3));
|
if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-3));
|
||||||
@ -1030,7 +1001,6 @@ void MainWindow::readFromStdout() //readFromStdout
|
|||||||
// m_bandmapText="";
|
// m_bandmapText="";
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if(t.indexOf("@") >= 0) {
|
if(t.indexOf("@") >= 0) {
|
||||||
m_messagesText += t.mid(1);
|
m_messagesText += t.mid(1);
|
||||||
m_widebandDecode=true;
|
m_widebandDecode=true;
|
||||||
|
@ -136,6 +136,7 @@ private:
|
|||||||
qint32 m_hsymStop;
|
qint32 m_hsymStop;
|
||||||
qint32 m_len1;
|
qint32 m_len1;
|
||||||
qint32 m_inGain;
|
qint32 m_inGain;
|
||||||
|
qint32 m_nsave;
|
||||||
|
|
||||||
bool m_monitoring;
|
bool m_monitoring;
|
||||||
bool m_transmitting;
|
bool m_transmitting;
|
||||||
@ -218,11 +219,11 @@ extern "C" {
|
|||||||
void symspec_(int* k, int* ntrperiod, int* nsps, int* ingain, int* nb,
|
void symspec_(int* k, int* ntrperiod, int* nsps, int* ingain, int* nb,
|
||||||
int* m_NBslider, float* px, float s[], float red[],
|
int* m_NBslider, float* px, float s[], float red[],
|
||||||
float* df3, int* nhsym, int* nzap, float* slimit,
|
float* df3, int* nhsym, int* nzap, float* slimit,
|
||||||
uchar lstrong[], float c0[], int* npts8);
|
uchar lstrong[], int* npts8);
|
||||||
|
|
||||||
void genjt9_(char* msg, char* msgsent, int itone[], int len1, int len2);
|
void genjt9_(char* msg, char* msgsent, int itone[], int len1, int len2);
|
||||||
|
|
||||||
void decoder_(int* ntrperiod, int* ndepth, int* mRxLog, float c0[]);
|
//void decoder_(int* ntrperiod, int* ndepth, int* mRxLog, float c0[]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
12
soundin.cpp
12
soundin.cpp
@ -9,6 +9,7 @@ extern "C" {
|
|||||||
extern struct {
|
extern struct {
|
||||||
float ss[184*NSMAX]; //This is "common/jt9com/..." in fortran
|
float ss[184*NSMAX]; //This is "common/jt9com/..." in fortran
|
||||||
float savg[NSMAX];
|
float savg[NSMAX];
|
||||||
|
float c0[2*1800*1500];
|
||||||
short int d2[1800*12000];
|
short int d2[1800*12000];
|
||||||
int nutc; //UTC as integer, HHMM
|
int nutc; //UTC as integer, HHMM
|
||||||
int ndiskdat; //1 ==> data read from *.wav file
|
int ndiskdat; //1 ==> data read from *.wav file
|
||||||
@ -16,12 +17,17 @@ extern struct {
|
|||||||
int mousefqso; //User-selected QSO freq (kHz)
|
int mousefqso; //User-selected QSO freq (kHz)
|
||||||
int newdat; //1 ==> new data, must do long FFT
|
int newdat; //1 ==> new data, must do long FFT
|
||||||
int npts8; //npts in c0() array
|
int npts8; //npts in c0() array
|
||||||
int nfb; //High decode limit (kHz)
|
int nfa; //Low decode limit (Hz)
|
||||||
|
int nfb; //High decode limit (Hz)
|
||||||
int ntol; //+/- decoding range around fQSO (Hz)
|
int ntol; //+/- decoding range around fQSO (Hz)
|
||||||
int kin;
|
int kin;
|
||||||
int nzhsym;
|
int nzhsym;
|
||||||
int nsynced;
|
int nsave;
|
||||||
int ndecoded;
|
int nagain;
|
||||||
|
int ndepth;
|
||||||
|
int nrxlog;
|
||||||
|
int nfsample;
|
||||||
|
char datetime[20];
|
||||||
} jt9com_;
|
} jt9com_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
QT += core gui network
|
QT += core gui network
|
||||||
CONFIG += qwt thread
|
CONFIG += qwt thread
|
||||||
CONFIG += console release
|
#CONFIG += console
|
||||||
|
|
||||||
TARGET = wsjtx
|
TARGET = wsjtx
|
||||||
VERSION = 0.2
|
VERSION = 0.2
|
||||||
@ -38,7 +38,7 @@ SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \
|
|||||||
displaytext.cpp getdev.cpp
|
displaytext.cpp getdev.cpp
|
||||||
|
|
||||||
win32 {
|
win32 {
|
||||||
SOURCES +=
|
SOURCES += killbyname.cpp
|
||||||
}
|
}
|
||||||
|
|
||||||
HEADERS += mainwindow.h plotter.h soundin.h soundout.h \
|
HEADERS += mainwindow.h plotter.h soundin.h soundout.h \
|
||||||
|
Loading…
Reference in New Issue
Block a user