mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05: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
							
								
									73f5728dcd
								
							
						
					
					
						commit
						d25e129756
					
				
							
								
								
									
										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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user