Exemplo n.º 1
0
int main(int argc,char *argv[]) {
  int i;
  
  
  struct {
    double x,y,z;
    int16 flg;
    int32 data[4];
    float angle;
  } dat;
  
  int pattern[]={8,3,2,1,4,4,4,1,0,0};
  
  unsigned char *str;
  
  dat.x=0.5;
  dat.y=0.2;
  dat.z=0.3;
  dat.flg=1023;
  dat.data[0]=18000;
  dat.data[1]=32000;
  dat.data[2]=64000;
  dat.data[3]=12000;
  dat.angle=45.5;
   
  str=(unsigned char *) &dat;
 
 
  ConvertBlock(str,pattern);
  fprintf(stdout,"buf=");
  for (i=0;i<sizeof(dat);i++) fprintf(stdout,"%.2x",str[i]);
  fprintf(stdout,"\n");
  
  return 0;
}
Exemplo n.º 2
0
struct fitfp *fit_open(char *fitfile,char *inxfile) {

  
  int r1_pat[]={4,2,1,2,2,17,4,2,2,14,4,4,2,4,
                2,PULSE_PAT_LEN,2,2*LAG_TAB_LEN,1,ORIG_COMBF_SIZE,4,3,
		2,2*ORIG_MAX_RANGE,1,ORIG_MAX_RANGE,0,0};
  int status=0;
  union fit_out r;
  struct fitfp *ptr=NULL;
  int16 tmp,i,j;
  int32 inx_buf[4];
  struct radar_parms *prms=NULL;
  char *tmpbuf;
  ptr=malloc(sizeof(struct fitfp));
  if (ptr==NULL) return NULL;
 
  ptr->fitfp=-1;
  ptr->inxfp=-1;
  ptr->ibuf=NULL;
  ptr->fbuf=NULL;
  ptr->iptr=0;
  ptr->fptr=0;
  ptr->ctime=-1;
  ptr->stime=-1;
  ptr->etime=-1;
  ptr->fitfp=open(fitfile,O_RDONLY);
  if (ptr->fitfp==-1) {
    free(ptr);
    return NULL;
  }

  fstat(ptr->fitfp,&ptr->fstat);
  

  /* buffering disabled as it is actually slower to load into memory!  
  ptr->fbuf=malloc(ptr->fstat.st_size);
  if (ptr->fbuf !=NULL) {
    if (read(ptr->fitfp,ptr->fbuf,
             ptr->fstat.st_size) !=ptr->fstat.st_size) {
       close(ptr->fitfp);
       free(ptr->fbuf);
       free(ptr);
       return NULL;
    }
    close(ptr->fitfp);
    ptr->fitfp=-1;
  }
  */
  
  if (inxfile !=NULL) { /* open the index file */
    ptr->inxfp=open(inxfile,O_RDONLY);
    if (ptr->inxfp !=-1) { 
      fstat(ptr->inxfp,&ptr->istat);
      ptr->ibuf=malloc(ptr->istat.st_size);
      if ((ptr->ibuf !=NULL) &&
          (read(ptr->inxfp,ptr->ibuf,ptr->istat.st_size) 
           !=ptr->istat.st_size)) free(ptr->ibuf);
       close(ptr->inxfp);
       ptr->inxfp=-1;
    }
  } 

  if (ptr->fitfp !=-1) {
    ConvertReadShort(ptr->fitfp,&tmp);
    ptr->fit_recl=tmp;
    ConvertReadShort(ptr->fitfp,&tmp);
    ptr->inx_recl=tmp;
  
    tmpbuf=malloc(ptr->fit_recl);
    if (tmpbuf !=NULL) { /* get the header information */
       memset(tmpbuf,0,ptr->fit_recl);
       status=(read(ptr->fitfp,tmpbuf,ptr->fit_recl) !=ptr->fit_recl);
       /* now decode the header information */
       if (status==0) {
          for (i=0;(tmpbuf[i] !='\n') && (tmpbuf[i] !=0) && (i<80);i++) 
            ptr->header[i]=tmpbuf[i];
          ptr->header[i]=0;
          j=i+1;
          for (i=0;(tmpbuf[j+i] !='\n') && (tmpbuf[j+i] !=0) && (i<32);i++) 
            ptr->date[i]=tmpbuf[j+i];
          ptr->date[i]=0;
          j+=i+1;
          for (i=0;(tmpbuf[j+i] !=0) && (i<256);i++) 
            ptr->extra[i]=tmpbuf[j+i];
          ptr->extra[i]=0;
         
          /* okay extra the version information - look for the '.' */

          for (i=0;(ptr->header[i] !='.') && (ptr->header[i] !=0);i++);
          if (ptr->header[i] !=0) { 
             tmpbuf[i]=0; /* work backwards for the major number */
             for (j=0;(ptr->header[i-1-j] !=' ') && ((i-1-j)>0);j++)
               tmpbuf[i-1-j]=ptr->header[i-1-j];
             ptr->major_rev=atoi(tmpbuf+i-j);
             for (j=0;(ptr->header[i+1+j] !=' ') && 
                 (ptr->header[i+1+j] !=0);i++) tmpbuf[j]=ptr->header[i+1+j]; 
             tmpbuf[j]=0;
             ptr->minor_rev=atoi(tmpbuf);
             
          }
       }
       free(tmpbuf);
    }
    
    lseek(ptr->fitfp,ptr->fit_recl,SEEK_SET);

    /* read the first parameter block se we can determine the year */
    status=(read(ptr->fitfp,&r,sizeof(union fit_out)) !=sizeof(union fit_out));
    if (status==0) {
      ConvertBlock( (unsigned char *) &r,r1_pat);
      status=(r.r1.rrn !=0);
      prms=(struct radar_parms *) &(r.r1.plist[0]);
    }
    lseek(ptr->fitfp,ptr->fit_recl,SEEK_SET);
  } else {
    ConvertToShort(ptr->fbuf,&tmp);
    ptr->fit_recl=tmp;
    ConvertToShort(ptr->fbuf+2,&tmp);
    ptr->inx_recl=tmp;
    ptr->fptr=ptr->fit_recl;
    memcpy( (unsigned char *) &r,
            ptr->fbuf+ptr->fit_recl,sizeof(union fit_out));
    ConvertBlock( (unsigned char *) &r,r1_pat);
    status=(r.r1.rrn !=0);
    prms=(struct radar_parms *) &(r.r1.plist[0]);
  }

  if (status !=0) {
    if (ptr->fitfp !=-1) close(ptr->fitfp);
    if (ptr->fbuf !=NULL) free(ptr->fbuf);
    if (ptr->inxfp !=-1) close(ptr->inxfp);
    if (ptr->ibuf !=NULL) free(ptr->ibuf);
    free(ptr);
    return NULL; 
  }

  ptr->ctime=TimeYMDHMSToEpoch(prms->YEAR,prms->MONTH,prms->DAY,
			prms->HOUR,prms->MINUT,prms->SEC);

  ptr->stime=ptr->ctime;  
  


  if (fit_read_inx(ptr,inx_buf,-1)==0) {

    if (inx_buf[0] > inx_buf[1]) prms->YEAR++;
    /* generate the end time of the file */
 
    ptr->etime=TimeYMDHMSToEpoch(prms->YEAR,1,1,0,0,0)
                +inx_buf[1];   
    ptr->inx_srec=inx_buf[2]-2;
    ptr->inx_erec=inx_buf[3];     
  } else { /* corrupt index file */
    if (ptr->inxfp !=-1) close(ptr->inxfp);
    if (ptr->ibuf !=NULL) free(ptr->ibuf);
    ptr->ibuf=NULL;
    ptr->inxfp=-1;
  } 
  ptr->fitread=fit_read_current;
  return ptr;        
}
Exemplo n.º 3
0
int OldFitCnxDecodeIPMsg(struct RadarParm *prm,struct FitData *fit,
                         unsigned char *buffer) {
  unsigned char *buf;
  unsigned char *gsct;
  unsigned char *dflg;
  struct radar_parms oldprm;

  int pat[]={1,2,2,17,4,2,2,14,4,4,2,4,0,0};
  
  int i;
  int rng_num=0;
  int index;

  if (buffer[0] !='d') return 0;
  buf=buffer+1;

  ConvertBlock(buf,pat);
  memcpy(&oldprm,buf,sizeof(struct radar_parms));
  buf+=sizeof(struct radar_parms);

  gsct=buf;
  dflg=buf+10;
  buf+=20;

  prm->revision.major=oldprm.REV.MAJOR;
  prm->revision.minor=oldprm.REV.MINOR;
  prm->cp=oldprm.CP;
  prm->stid=oldprm.ST_ID;
  prm->time.yr=oldprm.YEAR;
  prm->time.mo=oldprm.MONTH;
  prm->time.dy=oldprm.DAY;
  prm->time.hr=oldprm.HOUR;
  prm->time.mt=oldprm.MINUT;
  prm->time.sc=oldprm.SEC;
  prm->time.us=0;

  prm->txpow=oldprm.TXPOW;
  prm->nave=oldprm.NAVE;
  prm->atten=oldprm.ATTEN;
  prm->lagfr=oldprm.LAGFR;
  prm->smsep=oldprm.SMSEP;
  prm->ercod=oldprm.ERCOD;
  prm->stat.agc=oldprm.AGC_STAT;
  prm->stat.lopwr=oldprm.LOPWR_STAT;
  prm->noise.search=oldprm.NOISE;
  prm->noise.mean=oldprm.NOISE_MEAN;
      
  prm->channel=oldprm.CHANNEL;
  prm->bmnum=oldprm.BMNUM;
  prm->scan=oldprm.SCAN;
  
  prm->offset=oldprm.usr_resL1; 
  prm->rxrise=oldprm.RXRISE;
  prm->intt.sc=oldprm.INTT;
  prm->intt.us=0;
  prm->txpl=oldprm.TXPL;
    
  prm->mpinc=oldprm.MPINC;
  prm->mppul=oldprm.MPPUL;
  prm->mplgs=oldprm.MPLGS;
  prm->nrang=oldprm.NRANG;
  prm->frang=oldprm.FRANG;
  prm->rsep=oldprm.RSEP;
  prm->xcf=oldprm.XCF; 
  prm->tfreq=oldprm.TFREQ;
  prm->mxpwr=oldprm.MXPWR;
  prm->lvmax=oldprm.LVMAX;   

  for (i=0;i<MAX_RANGE;i++) {
    fit->rng[i].qflg=0;
    fit->rng[i].gsct=0;
    fit->rng[i].v=0;
    fit->rng[i].v_err=0;
    fit->rng[i].p_0=0;
    fit->rng[i].p_l=0;
    fit->rng[i].p_l_err=0;
    fit->rng[i].p_s=0;
    fit->rng[i].p_s_err=0;
    fit->rng[i].w_l=0;
    fit->rng[i].w_l_err=0;
    fit->rng[i].w_s=0;
    fit->rng[i].w_s_err=0;
    fit->rng[i].phi0=0;
    fit->rng[i].phi0_err=0;
    fit->rng[i].sdev_l=0;
    fit->rng[i].sdev_s=0;
    fit->rng[i].sdev_phi=0;
    fit->rng[i].nump=0;
  }
  for (i=0;i<ORIG_MAX_RANGE;i++) {
    if (read_bit(dflg,i) !=0) {
      fit->rng[i].qflg=1;
      rng_num++;
    }
  }

  if (rng_num == 0) return 1;
  index=0;
  for (i=0;i<ORIG_MAX_RANGE;i++) {
    if (fit->rng[i].qflg !=0) {
      if (read_bit(gsct,i) !=0) fit->rng[i].gsct=1;
      ConvertToDouble(buf+8*index,&fit->rng[i].p_l);
      ConvertToDouble(buf+8*(index+rng_num),&fit->rng[i].v);
      ConvertToDouble(buf+8*(index+2*rng_num),&fit->rng[i].w_l);
      index++;
    }
  } 
  return 1;
}
Exemplo n.º 4
0
int raw_read_current(struct rawfp *fp,struct rawdata *raw_data) { 

   /* read raw data block from file */


   int radar_parms_pat[]={1,2,2,17,4,2,2,14,4,4,2,4,0,0};
   int i;
   int16 range;
   int j;
   int16 prev_range;
   int xcf_data;
   unsigned int stat;
   int16 num_byte;
   int32 rec_num=0;
   unsigned char *inbuf;
   unsigned char *inbuf_ptr;

   xcf_data = 0;
   prev_range = -1;

   inbuf=malloc(sizeof(struct rawdata));

   /* zero out the raw data buffer */
   memset(raw_data,0,sizeof(struct rawdata));
   fp->rlen=0;
   do {
     if (ConvertReadShort(fp->rawfp,&num_byte) !=0) {
       free(inbuf);
       return -1;
     }
     fp->rlen+=num_byte;
     fp->ptr+=num_byte;
     num_byte = num_byte - 2;
     stat = read(fp->rawfp,inbuf,num_byte);
     if(stat != num_byte) {
       free(inbuf);
       return -1; 
     }
     inbuf_ptr=inbuf;
     ConvertToInt(inbuf_ptr,&rec_num);
   } while (rec_num==0); 
   inbuf_ptr = inbuf_ptr + 12;  /* skip rec_num + rawwrite */  
   num_byte = num_byte - 12;
  
   /* zero out the raw data buffer */

   /* copy radar_parms */   
   ConvertBlock(inbuf_ptr,radar_parms_pat);
   memcpy((void *) &(raw_data->PARMS),inbuf_ptr,sizeof(struct radar_parms)); 
   inbuf_ptr = inbuf_ptr + sizeof(struct radar_parms);
   num_byte = num_byte - sizeof(struct radar_parms);

   /* copy the pulse pattern */
  
   for (i=0;i<raw_data->PARMS.MPPUL;i++) {
      ConvertToShort(inbuf_ptr,&raw_data->PULSE_PATTERN[i]);
      inbuf_ptr+=sizeof(int16);
      num_byte-=sizeof(int16);
   }

   /* copy the lag table */

    for(j=0;j < 2; ++j)
      for(i=0; i < raw_data->PARMS.MPLGS; ++i) {
         ConvertToShort(inbuf_ptr,&raw_data->LAG_TABLE[j][i]);
         inbuf_ptr = inbuf_ptr + sizeof(int16);
         num_byte = num_byte - sizeof(int16);
      } 
	  
   /* copy comment buffer */
   memcpy(raw_data->COMBF,inbuf_ptr,ORIG_COMBF_SIZE);
   inbuf_ptr = inbuf_ptr + ORIG_COMBF_SIZE;
   num_byte = num_byte - ORIG_COMBF_SIZE;

   /* decompress and copy the lag-0 powers */
   for(i=0 ; i < raw_data->PARMS.NRANG ; ++i) {
      raw_data->pwr0[i] = dcmpr(inbuf_ptr);
      inbuf_ptr = inbuf_ptr + sizeof(int16);
      num_byte = num_byte - sizeof(int16);
   }

   /* decompress and copy acfs */
   while ( num_byte > 0 ) {
      ConvertToShort(inbuf_ptr,&range);
      --range;
      inbuf_ptr = inbuf_ptr + sizeof(int16);
      num_byte = num_byte - sizeof(int16);

      if((range <= prev_range) && (raw_data->PARMS.XCF))
		   xcf_data = 1;

      for(i = 0; i < raw_data->PARMS.MPLGS ; ++i) {   
         for(j=0 ; j < 2; ++j) {
	    if (xcf_data) raw_data->xcfd[range][i][j] = dcmpr(inbuf_ptr);
	    else raw_data->acfd[range][i][j] = dcmpr(inbuf_ptr);
            inbuf_ptr = inbuf_ptr + sizeof(int16);
            num_byte = num_byte - sizeof(int16);
         }
      }
		
      prev_range = range;

   } 
  fp->ctime=TimeYMDHMSToEpoch(raw_data->PARMS.YEAR,
			raw_data->PARMS.MONTH,
			raw_data->PARMS.DAY,
			raw_data->PARMS.HOUR,
			raw_data->PARMS.MINUT,
			raw_data->PARMS.SEC);
  free(inbuf);  
  return 0;
}
Exemplo n.º 5
0
unsigned char *fitpacket(struct RadarParm *prm,
              struct FitData *fit,int *size) {

  int pat[]={1,2,2,17,4,2,2,14,4,4,2,4,0,0};
  int dpat[]={8,0,0,0};

  int rtab[ORIG_MAX_RANGE];
  float *snr;

  unsigned char *ptr=NULL;                
  unsigned char *dflg;
  unsigned char *gsct;
  double *store;

  int rng_num,loop,l,inx,s,step;
  float maxval;

  struct radar_parms oldprm;

  oldprm.REV.MAJOR=prm->revision.major;
  oldprm.REV.MINOR=prm->revision.minor;
  oldprm.NPARM=48;
  oldprm.CP=prm->cp;
  oldprm.ST_ID=prm->stid;
  oldprm.YEAR=prm->time.yr;
  oldprm.MONTH=prm->time.mo;
  oldprm.DAY=prm->time.dy;
  oldprm.HOUR=prm->time.hr;
  oldprm.MINUT=prm->time.mt;
  oldprm.SEC=prm->time.sc;
   
  oldprm.TXPOW=prm->txpow;
  oldprm.NAVE=prm->nave;
  oldprm.ATTEN=prm->atten;
  oldprm.LAGFR=prm->lagfr;
  oldprm.SMSEP=prm->smsep;
  oldprm.ERCOD=prm->ercod;
  oldprm.AGC_STAT=prm->stat.agc;
  oldprm.LOPWR_STAT=prm->stat.lopwr;
  oldprm.NOISE=prm->noise.search;
  oldprm.NOISE_MEAN=prm->noise.mean;
      
  oldprm.CHANNEL=prm->channel;
  oldprm.BMNUM=prm->bmnum;
  oldprm.SCAN=prm->scan;
 
  oldprm.RXRISE=prm->rxrise;
  oldprm.INTT=prm->intt.sc;
  oldprm.TXPL=prm->txpl;
    
  oldprm.MPINC=prm->mpinc;
  oldprm.MPPUL=prm->mppul;
  oldprm.MPLGS=prm->mplgs;
  oldprm.NRANG=prm->nrang;
  oldprm.FRANG=prm->frang;
  oldprm.RSEP=prm->rsep;
  oldprm.XCF=prm->xcf; 
  oldprm.TFREQ=prm->tfreq;
  oldprm.MXPWR=prm->mxpwr;
  oldprm.LVMAX=prm->lvmax;   

  snr=malloc(sizeof(float)*prm->nrang);
  if (snr==NULL) return NULL;

  for (l=0;l<prm->nrang;l++) {
    if (prm->noise.search>0)
      snr[l]=fit->rng[l].p_0/prm->noise.search;
      else snr[l]=0;
  }
  
  if (prm->nrang>ORIG_MAX_RANGE) {
    step=prm->nrang/ORIG_MAX_RANGE;
    for (l=0;l<ORIG_MAX_RANGE;l++) {
      maxval=0.0;
      inx=l*step;
      for (s=0;s<step;s++) {
        /*
                    if (fit->rng[l*step+s].qflg==0) continue;
                    if (fit->rng[l*step+s].gsct !=0) continue;
	*/
	if (snr[l*step+s]>maxval) {
	  maxval=snr[l*step+s];
	  inx=l*step+s;
	}
      }
      rtab[l]=inx;
    }
    oldprm.RSEP=prm->rsep*step;
  } else for (l=0;l<ORIG_MAX_RANGE;l++) rtab[l]=l;
  free(snr);

  rng_num=0;
  for (loop=0;loop<ORIG_MAX_RANGE;loop++) 
    if (fit->rng[rtab[loop]].qflg ==1) rng_num++;
 
  ptr=malloc(sizeof(struct radar_parms)+21+3*sizeof(double)*rng_num);
  if (ptr==NULL) return 0;

  ptr[0]='d';
  gsct=ptr+1+sizeof(struct radar_parms);
  dflg=gsct+10;
  store=(double *) (dflg+10);

  memcpy(ptr+1,&oldprm,sizeof(struct radar_parms));
  ConvertBlock(ptr+1,pat);
 
  memset(gsct,0,10);
  memset(dflg,0,10);

  /* work out which ranges to store */
   
  for (loop=0;loop<ORIG_MAX_RANGE;loop++) {
    if (fit->rng[rtab[loop]].gsct !=0) set_bit(gsct,loop);
    if (fit->rng[rtab[loop]].qflg ==1) set_bit(dflg,loop);
  }
 
  /* store the ranges */
      
  if (rng_num>0) {
    int index=0;
    for (loop=0;loop<ORIG_MAX_RANGE;loop++) {
      if (read_bit(dflg,loop) !=0) {
        store[index]=fit->rng[rtab[loop]].p_l;
        store[index+rng_num]=fit->rng[rtab[loop]].v;
        store[index+2*rng_num]=fit->rng[rtab[loop]].w_l;  
	/* store[index+2*rng_num]=fit->rng[rtab[loop]].v_err; */
        index++;
      } 
    }
  }

  /* convert the stored values */
  dpat[1]=3*rng_num;
  ConvertBlock( (unsigned char *) store,dpat);
  
  *size=(sizeof(struct radar_parms)+21+3*sizeof(double)*rng_num);
  return ptr;
}
Exemplo n.º 6
0
struct OldRawFp *OldRawOpenFd(int rawfd,int inxfd) {

  int radar_parms_pat[]={1,2,2,17,4,2,2,14,4,4,2,4,0,0};

  unsigned char *inbuf=NULL;
  int16 num_byte;
  int32 rec_num;
  int stat;
  struct radar_parms *prm;
  struct OldRawFp *ptr=NULL;
  int status=0;
  int j;

  inbuf=malloc(sizeof(struct rawdata));
  if (inbuf==NULL) return NULL;

  ptr=malloc(sizeof(struct OldRawFp));
  
  if (ptr==NULL) return NULL;

  ptr->rawfp=rawfd;
  ptr->stime=-1;
  ptr->ctime=-1;
  ptr->frec=0;
  ptr->rlen=0;
  ptr->ptr=0;

  fstat(ptr->rawfp,&ptr->rstat);

  if (ConvertReadShort(ptr->rawfp,&num_byte) !=0) {
    close(ptr->rawfp);
    free(ptr);
    free(inbuf);
    return NULL;
  }

  num_byte = num_byte - 2;
  stat = read(ptr->rawfp,inbuf,num_byte);
  if (stat != num_byte) {
    close(ptr->rawfp);
    free(ptr);
    free(inbuf);
    return NULL;
  }
  ConvertToInt(inbuf,&rec_num);

  ptr->frec=num_byte+2;
  ptr->rlen=num_byte+2;
  ptr->ptr=num_byte+2;

  if (rec_num==0) { /* decode header to get the threshold */
    char tmp[256];
    char *str;
    strcpy(tmp,(char *) (inbuf+sizeof(struct rawrechdr)-sizeof(int16)+1));
    ptr->thr=3;
    str=strtok(tmp," ");
    if (str==NULL) status=-1;
    if ((status==0) && (strcmp(str,"version") !=0)) status=-1;
    if (status==0) str=strtok(NULL," ");
    if (str==NULL) status=-1;
    for (j=0;str[j] !=0;j++) if (str[j]=='.') break;
    if (str[j]==0) {
      ptr->major_rev=atoi(str);
    } else {
      str[j]=0;
      ptr->major_rev=atoi(str);
      ptr->minor_rev=atoi(str+j+1);
    }
    if (status==0) str=strtok(NULL," ");
    if (str==NULL) status=-1;
    if ((status==0) && (strcmp(str,"threshold") !=0)) status=-1;
    if (status==0) str=strtok(NULL," ");
    if (str==NULL) status=-1;
    if (status==0) ptr->thr=atoi(str);
  }

  if (rec_num !=0) { /* not the header so rewind the file */
    lseek(ptr->rawfp,0L,SEEK_SET);
    ptr->rlen=0;
  }

  /* read the first record so that we can determine the start time of 
     the file */

  
 if (ConvertReadShort(ptr->rawfp,&num_byte) !=0) {
    close(ptr->rawfp);
    free(ptr);
    free(inbuf);
    return NULL;
  }

  num_byte = num_byte - 2;
  stat = read(ptr->rawfp,inbuf,num_byte);
  if (stat != num_byte) {
    close(ptr->rawfp);
    free(ptr);
    free(inbuf);
    return NULL;
  }

  ConvertToInt(inbuf,&rec_num);

  /* now decode the parameter block */

  ConvertBlock(inbuf+12,radar_parms_pat);
  prm=(struct radar_parms *) (inbuf+12);   

  ptr->stime=TimeYMDHMSToEpoch(prm->YEAR,prm->MONTH,prm->DAY,
	  prm->HOUR,prm->MINUT,prm->SEC);

  ptr->ctime=ptr->stime;

  /* rewind to the first record */

  lseek(ptr->rawfp,ptr->frec,SEEK_SET);

  ptr->rawread=OldRawReadCurrent;

  free(inbuf);
  return ptr;
}
Exemplo n.º 7
0
struct rawfp *raw_open(char *rawfile,char *inxfile) {

    int radar_parms_pat[]= {1,2,2,17,4,2,2,14,4,4,2,4,0,0};

    unsigned char *inbuf=NULL;
    int16 num_byte;
    int32 rec_num;
    int stat;
    struct radar_parms *prm;
    struct rawfp *ptr=NULL;

    inbuf=malloc(sizeof(struct rawdata));
    if (inbuf==NULL) return NULL;

    ptr=malloc(sizeof(struct rawfp));

    if (ptr==NULL) return NULL;

    ptr->rawfp=open(rawfile,O_RDONLY);
    ptr->stime=-1;
    ptr->ctime=-1;
    ptr->frec=0;
    ptr->rlen=0;
    ptr->ptr=0;
    if (ptr->rawfp==-1) {
        free(ptr);
        free(inbuf);
        return NULL;
    }
    fstat(ptr->rawfp,&ptr->rstat);

    if (ConvertReadShort(ptr->rawfp,&num_byte) !=0) {
        close(ptr->rawfp);
        free(ptr);
        free(inbuf);
        return NULL;
    }

    num_byte = num_byte - 2;
    stat = read(ptr->rawfp,inbuf,num_byte);
    if (stat != num_byte) {
        close(ptr->rawfp);
        free(ptr);
        free(inbuf);
        return NULL;
    }
    ConvertToInt(inbuf,&rec_num);

    ptr->frec=num_byte+2;
    ptr->rlen=num_byte+2;
    ptr->ptr=num_byte+2;

    if (rec_num !=0) { /* not the header so rewind the file */
        lseek(ptr->rawfp,0L,SEEK_SET);
        ptr->rlen=0;
    }

    /* read the first record so that we can determine the start time of
       the file */


    if (ConvertReadShort(ptr->rawfp,&num_byte) !=0) {
        close(ptr->rawfp);
        free(ptr);
        free(inbuf);
        return NULL;
    }

    num_byte = num_byte - 2;
    stat = read(ptr->rawfp,inbuf,num_byte);
    if (stat != num_byte) {
        close(ptr->rawfp);
        free(ptr);
        free(inbuf);
        return NULL;
    }

    ConvertToInt(inbuf,&rec_num);

    /* now decode the parameter block */

    ConvertBlock(inbuf+12,radar_parms_pat);
    prm=(struct radar_parms *) (inbuf+12);

    ptr->stime=TimeYMDHMSToEpoch(prm->YEAR,prm->MONTH,prm->DAY,
                                 prm->HOUR,prm->MINUT,prm->SEC);

    /* rewind to the first record */

    lseek(ptr->rawfp,ptr->frec,SEEK_SET);

    ptr->rawread=raw_read_current;

    free(inbuf);
    return ptr;
}