]> Pileus Git - ~andy/rsl/blobdiff - nsig_to_radar.c
RSL v1.44
[~andy/rsl] / nsig_to_radar.c
index 03d739f75fe5b339ae31f5945bfde81e7e422d52..da9a8ef603641715f12d5c513189b9e51b5893e6 100644 (file)
@@ -174,9 +174,10 @@ RSL_nsig_to_radar
   float max_vel, sweep_rate, azim_rate;
   float ray_data;
   float az1, az2;
+  float elev1, elev2;
   double tmp;
   float sqi, log, csr, sig, cal_dbz;
-  char radar_type[50], state[2], city[15];
+  char radar_type[50], state[4], city[15];
   char site_name[16];
   NSIG_Product_file *prod_file;
   short id;
@@ -190,9 +191,11 @@ RSL_nsig_to_radar
   twob nsig_twob;
   Sweep *sweep;
   int msec;
+  const unsigned short low10bits = 0x3ff;
   float azm, elev, pitch, roll, heading, azm_rate, elev_rate,
     pitch_rate, roll_rate, heading_rate,
     lat, lon;
+  float fix_angle;
   int alt;  /* Altitude */
   float rvc;  /* Radial correction velocity m/s */
   float vel_east, vel_north, vel_up; /* Platform velocity vectors m/sec */
@@ -476,6 +479,9 @@ RSL_nsig_to_radar
    radar->h.height = (int)sea_lvl_hgt;
    radar->h.spulse = (int)(pw*1000);
    radar->h.lpulse = (int)(pw*1000);
+   ant_scan_mode = NSIG_I2(prod_file->rec2.task_config.scan_info.ant_scan_mode);
+   if(ant_scan_mode == 2 || ant_scan_mode == 7) radar->h.scan_mode = RHI;
+   else radar->h.scan_mode = PPI;
 
    if (radar_verbose_flag) {
 #ifdef NSIG_VER2
@@ -523,7 +529,7 @@ RSL_nsig_to_radar
       sweep_day = NSIG_I2(nsig_sweep[itype]->idh.time.day);
       sweep_sec = NSIG_I4(nsig_sweep[itype]->idh.time.sec);
 #ifdef NSIG_VER2
-      msec      = NSIG_I2(nsig_sweep[itype]->idh.time.msec);
+      msec = NSIG_I2(nsig_sweep[itype]->idh.time.msec) & low10bits;
       /*      printf("....... msec == %d\n", msec); */
 #endif
       /* converting seconds since mid to time of day */
@@ -619,15 +625,27 @@ RSL_nsig_to_radar
         ifield = HC_INDEX;
         f      = HC_F; 
         invf   = HC_INVF;
+        break;
       case NSIG_DTB_DBZ2:
         ifield = CZ_INDEX;
         f      = CZ_F; 
         invf   = CZ_INVF;
+        break;
       case NSIG_DTB_ZDRC2:
         ifield = ZD_INDEX;
         f      = ZD_F; 
         invf   = ZD_INVF;
         break;
+      case NSIG_DTB_DBTE8:
+        ifield = ET_INDEX;
+        f      = ZT_F; 
+        invf   = ZT_INVF;
+        break;
+      case NSIG_DTB_DBZE8:
+        ifield = EZ_INDEX;
+        f      = DZ_F; 
+        invf   = DZ_INVF;
+        break;
       default:
         fprintf(stderr,"Unknown field type: %d  Skipping it.\n", data_type);
         continue;
@@ -665,8 +683,9 @@ RSL_nsig_to_radar
       sweep->h.beam_width = beam_width;
       sweep->h.vert_half_bw = vert_half_bw;
       sweep->h.horz_half_bw = horz_half_bw;
-      elev = nsig_from_bang(nsig_sweep[itype]->idh.fix_ang);
-      sweep->h.elev = elev;
+      fix_angle = nsig_from_bang(nsig_sweep[itype]->idh.fix_ang);
+      if (radar->h.scan_mode == PPI) sweep->h.elev = fix_angle;
+      else sweep->h.azimuth = fix_angle;
       
       for(j = 0; j < num_rays; j++)
         {
@@ -722,7 +741,7 @@ RSL_nsig_to_radar
             else
               ray->h.unam_rng = 0.0;
           ray->h.prf2 = (int) prf2;
-          ray->h.fix_angle = (float)sweep->h.elev;
+          ray->h.fix_angle = fix_angle;
           ray->h.azim_rate  = azim_rate;
           ray->h.pulse_count = num_samples;
           ray->h.pulse_width = pw;
@@ -731,7 +750,7 @@ RSL_nsig_to_radar
           ray->h.wavelength  = wave/100.0;     /* meters */
           ray->h.nyq_vel     = max_vel;        /* m/s */
           if (elev == 0.) elev = sweep->h.elev;
-          ray->h.elev        = (nsig_from_bang(ray_p->h.end_elev)+nsig_from_bang(ray_p->h.beg_elev))/2.0;
+
           /* Compute mean azimuth angle for ray. */
           az1 = nsig_from_bang(ray_p->h.beg_azm);
           az2 = nsig_from_bang(ray_p->h.end_azm);
@@ -747,6 +766,21 @@ RSL_nsig_to_radar
           if (az1 > 360) az1 -= 360;
           ray->h.azimuth     = az1;
 
+          /* Compute mean elevation angle for ray. */
+          elev1 = nsig_from_bang(ray_p->h.beg_elev);
+          elev2 = nsig_from_bang(ray_p->h.end_elev);
+          /*          printf("elev1, %f, elev2 %f\n", elev1, elev2); */
+          if(elev1 > elev2)
+            if((elev1 - elev2) > 180.0) elev2 += 360.0;
+            else
+              ;
+          else
+            if((elev2 - elev1) > 180.0) elev2 -= 360.0;
+
+          elev1 = (elev1 + elev2) / 2.0;
+          if (elev1 > 360) elev1 -= 360;
+          ray->h.elev = elev1;
+
           /* From the extended header information, we learn the following. */
           ray->h.pitch        = pitch;
           ray->h.roll         = roll;
@@ -777,6 +811,8 @@ RSL_nsig_to_radar
             switch(data_type) {
             case NSIG_DTB_UCR:
             case NSIG_DTB_CR:
+            case NSIG_DTB_DBTE8:
+            case NSIG_DTB_DBZE8:
               if (ray_p->range[k] == 0) ray_data = NSIG_NO_ECHO;
               else ray_data = (float)((ray_p->range[k]-64.0)/2.0);
               break;