263 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			263 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #include "getfile.h" | ||
|  | #include <QDir> | ||
|  | #include <stdlib.h> | ||
|  | #include <stdint.h> | ||
|  | #include <string.h> | ||
|  | #include <math.h> | ||
|  | 
 | ||
|  | #ifdef WIN32 | ||
|  | #include <windows.h> | ||
|  | #else | ||
|  | #include <sys/types.h> | ||
|  | #include <sys/stat.h> | ||
|  | #include <termios.h> | ||
|  | #include <fcntl.h> | ||
|  | #include <sys/ioctl.h> | ||
|  | #include <stdio.h> | ||
|  | #include <unistd.h> | ||
|  | #include <err.h> | ||
|  | #endif | ||
|  | 
 | ||
|  | #include "commons.h" | ||
|  | 
 | ||
|  | void getfile(QString fname, int ntrperiod) | ||
|  | { | ||
|  |   struct WAVHDR { | ||
|  |     char ariff[4]; | ||
|  |     int lenfile; | ||
|  |     char awave[4]; | ||
|  |     char afmt[4]; | ||
|  |     int lenfmt; | ||
|  |     short nfmt2; | ||
|  |     short nchan2; | ||
|  |     int nsamrate; | ||
|  |     int nbytesec; | ||
|  |     short nbytesam2; | ||
|  |     short nbitsam2; | ||
|  |     char adata[4]; | ||
|  |     int ndata; | ||
|  |   } hdr; | ||
|  | 
 | ||
|  |   char name[512]; | ||
|  |   strncpy(name,fname.toLatin1(), sizeof (name) - 1); | ||
|  |   name[sizeof (name) - 1] = '\0'; | ||
|  | 
 | ||
|  |   FILE* fp=fopen(name,"rb"); | ||
|  | 
 | ||
|  |   int i1=fname.lastIndexOf("/"); | ||
|  |   QString baseName=fname.mid(i1+1); | ||
|  | 
 | ||
|  |   i1=fname.indexOf(".wav",0,Qt::CaseInsensitive); | ||
|  |   dec_data.params.nutc=0; | ||
|  |   if(i1>0) { | ||
|  |     int i0=fname.indexOf("_",-11); | ||
|  |     if(i1==i0+7) { | ||
|  |       dec_data.params.nutc=fname.mid(i1-6,6).toInt(); | ||
|  |     } else { | ||
|  |       dec_data.params.nutc=100*fname.mid(i1-4,4).toInt(); | ||
|  |     } | ||
|  |   } | ||
|  |   if(ntrperiod > 120 or ntrperiod <0) ntrperiod=120; | ||
|  |   int npts=ntrperiod*12000; | ||
|  |   memset(dec_data.d2,0,2*npts); | ||
|  | 
 | ||
|  |   if(fp != NULL) { | ||
|  |     struct | ||
|  |     { | ||
|  |       char id[4]; | ||
|  |       uint32_t size; | ||
|  |     } desc; | ||
|  |     char type[4]; | ||
|  |     struct | ||
|  |     { | ||
|  |       uint16_t nfmt2; | ||
|  |       uint16_t nchan2; | ||
|  |       uint32_t nsamrate; | ||
|  |       uint32_t nbytesec; | ||
|  |       uint16_t nbytesam2; | ||
|  |       uint16_t nbitsam2; | ||
|  |     } fmt; | ||
|  | 
 | ||
|  |     // read header | ||
|  |     if (fread(&desc, sizeof desc, 1, fp) < 1) return; // RIFF | ||
|  |     if (fread(type, sizeof type, 1, fp) < 1) return;  // WAVE | ||
|  |     do | ||
|  |       { | ||
|  |         if (fread(&desc, sizeof desc, 1, fp) < 1) return; // WAVE component | ||
|  |         if (!memcmp(desc.id,"fmt ",4)) { | ||
|  |           fpos_t pos; | ||
|  |           fgetpos(fp,&pos); | ||
|  |           if (fread(&fmt,sizeof fmt,1,fp) < 1) return; | ||
|  |           fsetpos(fp,&pos); | ||
|  |         } | ||
|  |         if (!memcmp(desc.id,"data",sizeof desc.id)) break; | ||
|  |       } while (!fseek(fp,(desc.size + 1) / 2 * 2,SEEK_CUR)); | ||
|  |      | ||
|  | // Read (and ignore) a 44-byte WAV header; then read data | ||
|  | //    int n=fread(&hdr,1,44,fp); | ||
|  |     int n=fread(dec_data.d2,2,npts,fp); | ||
|  |     if(hdr.nsamrate==11025) wav12_(dec_data.d2,dec_data.d2,&n,(short*)&fmt.nbitsam2); | ||
|  |     fclose(fp); | ||
|  |     dec_data.params.newdat=1; | ||
|  |     dec_data.params.kin=n; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | void savewav(QString fname, int ntrperiod) | ||
|  | { | ||
|  |   struct { | ||
|  |     char ariff[4];         //ChunkID:    "RIFF" | ||
|  |     int nchunk;            //ChunkSize: 36+SubChunk2Size | ||
|  |     char awave[4];         //Format: "WAVE" | ||
|  |     char afmt[4];          //Subchunk1ID: "fmt " | ||
|  |     int lenfmt;            //Subchunk1Size: 16 | ||
|  |     short int nfmt2;       //AudioFormat: 1 | ||
|  |     short int nchan2;      //NumChannels: 1 | ||
|  |     int nsamrate;          //SampleRate: 12000 | ||
|  |     int nbytesec;          //ByteRate: SampleRate*NumChannels*BitsPerSample/8 | ||
|  |     short int nbytesam2;   //BlockAlign: NumChannels*BitsPerSample/8 | ||
|  |     short int nbitsam2;    //BitsPerSample: 16 | ||
|  |     char adata[4];         //Subchunk2ID: "data" | ||
|  |     int ndata;             //Subchunk2Size: numSamples*NumChannels*BitsPerSample/8 | ||
|  |   } hdr; | ||
|  | 
 | ||
|  |   int npts=ntrperiod*12000; | ||
|  | //  qint16* buf=(qint16*)malloc(2*npts); | ||
|  |   char name[512]; | ||
|  |   strncpy(name,fname.toLatin1(),sizeof (name) - 1); | ||
|  |   name[sizeof (name) - 1] = '\0'; | ||
|  |   FILE* fp=fopen(name,"wb"); | ||
|  | 
 | ||
|  |   if(fp != NULL) { | ||
|  | // Write a WAV header | ||
|  |     hdr.ariff[0]='R'; | ||
|  |     hdr.ariff[1]='I'; | ||
|  |     hdr.ariff[2]='F'; | ||
|  |     hdr.ariff[3]='F'; | ||
|  |     hdr.nchunk=36 + 2*npts; | ||
|  |     hdr.awave[0]='W'; | ||
|  |     hdr.awave[1]='A'; | ||
|  |     hdr.awave[2]='V'; | ||
|  |     hdr.awave[3]='E'; | ||
|  |     hdr.afmt[0]='f'; | ||
|  |     hdr.afmt[1]='m'; | ||
|  |     hdr.afmt[2]='t'; | ||
|  |     hdr.afmt[3]=' '; | ||
|  |     hdr.lenfmt=16; | ||
|  |     hdr.nfmt2=1; | ||
|  |     hdr.nchan2=1; | ||
|  |     hdr.nsamrate=12000; | ||
|  |     hdr.nbytesec=2*12000; | ||
|  |     hdr.nbytesam2=2; | ||
|  |     hdr.nbitsam2=16; | ||
|  |     hdr.adata[0]='d'; | ||
|  |     hdr.adata[1]='a'; | ||
|  |     hdr.adata[2]='t'; | ||
|  |     hdr.adata[3]='a'; | ||
|  |     hdr.ndata=2*npts; | ||
|  | 
 | ||
|  |     fwrite(&hdr,sizeof(hdr),1,fp); | ||
|  | //    memcpy(dec_data.d2,buf,2*npts); | ||
|  | //    fwrite(buf,2,npts,fp); | ||
|  |     fwrite(dec_data.d2,2,npts,fp); | ||
|  |     fclose(fp); | ||
|  |   } | ||
|  | //  free(buf); | ||
|  | } | ||
|  | 
 | ||
|  | //#define	MAX_RANDOM	0x7fffffff | ||
|  | /* Generate gaussian random float with mean=0 and std_dev=1 */ | ||
|  | float gran() | ||
|  | { | ||
|  |   float fac,rsq,v1,v2; | ||
|  |   static float gset; | ||
|  |   static int iset; | ||
|  | 
 | ||
|  |   if(iset){ | ||
|  |     /* Already got one */ | ||
|  |     iset = 0; | ||
|  |     return gset; | ||
|  |   } | ||
|  |   /* Generate two evenly distributed numbers between -1 and +1 | ||
|  |    * that are inside the unit circle | ||
|  |    */ | ||
|  |   do { | ||
|  |     v1 = 2.0 * (float)qrand() / RAND_MAX - 1; | ||
|  |     v2 = 2.0 * (float)qrand() / RAND_MAX - 1; | ||
|  |     rsq = v1*v1 + v2*v2; | ||
|  |   } while(rsq >= 1.0 || rsq == 0.0); | ||
|  |   fac = sqrt(-2.0*log(rsq)/rsq); | ||
|  |   gset = v1*fac; | ||
|  |   iset++; | ||
|  |   return v2*fac; | ||
|  | } | ||
|  | 
 | ||
|  | int ptt(int nport, int ntx, int* iptt, int* nopen) | ||
|  | { | ||
|  | #ifdef WIN32 | ||
|  |   static HANDLE hFile; | ||
|  |   char s[10]; | ||
|  |   int i3=1,i4=1,i5=1,i6=1,i9=1,i00=1;  //Defs to silence compiler warning | ||
|  | 
 | ||
|  |   if(nport==0) { | ||
|  |     *iptt=ntx; | ||
|  |     return 0; | ||
|  |   } | ||
|  | 
 | ||
|  |   if(ntx && (!(*nopen))) { | ||
|  |     sprintf(s,"\\\\.\\COM%d",nport); | ||
|  |     hFile=CreateFile(TEXT(s),GENERIC_WRITE,0,NULL,OPEN_EXISTING, | ||
|  |                      FILE_ATTRIBUTE_NORMAL,NULL); | ||
|  |     if(hFile==INVALID_HANDLE_VALUE) { | ||
|  |       QString t; | ||
|  |       t.sprintf("Cannot open COM port %d for PTT\n",nport); | ||
|  |       return 1; | ||
|  |     } | ||
|  |     *nopen=1; | ||
|  |   } | ||
|  | 
 | ||
|  |   if(ntx && *nopen) { | ||
|  |     i3=EscapeCommFunction(hFile,SETRTS); | ||
|  |     i5=EscapeCommFunction(hFile,SETDTR); | ||
|  |     *iptt=1; | ||
|  |   } | ||
|  | 
 | ||
|  |   else { | ||
|  |     i4=EscapeCommFunction(hFile,CLRRTS); | ||
|  |     i6=EscapeCommFunction(hFile,CLRDTR); | ||
|  |     i9=EscapeCommFunction(hFile,CLRBREAK); | ||
|  |     i00=CloseHandle(hFile); | ||
|  |     *iptt=0; | ||
|  |     *nopen=0; | ||
|  |   } | ||
|  |   if((i3+i4+i5+i6+i9+i00)==-999) return 1;    //Silence compiler warning | ||
|  |   return 0; | ||
|  | #else | ||
|  |   int control=TIOCM_RTS | TIOCM_DTR; | ||
|  | //  int control = TIOCM_RTS; | ||
|  |   static int fd; | ||
|  | 
 | ||
|  |   if(*nopen==0) { | ||
|  |     fd=open("/dev/ttyUSB0",O_RDWR | O_NONBLOCK); | ||
|  |     if(fd<0) { | ||
|  |       return -1; | ||
|  |     } | ||
|  |     *nopen=1; | ||
|  |   } | ||
|  | 
 | ||
|  |   if(ntx) { | ||
|  |     ioctl(fd, TIOCMBIS, &control); | ||
|  |     *iptt=1; | ||
|  |     *nopen=1; | ||
|  |   } else { | ||
|  |     ioctl(fd, TIOCMBIC, &control); | ||
|  |     close(fd); | ||
|  |     *iptt=0; | ||
|  |     *nopen=0; | ||
|  |   } | ||
|  |   return 0; | ||
|  | #endif | ||
|  |   if((nport+ntx+(*iptt)==-99999)) *nopen=0;   //Silence compiler warning | ||
|  |   return 0; | ||
|  | } |