* This file contains routines for processing Message Type 31, the digital
* radar message type introduced in WSR-88D Level II Build 10.
*/
+#include <stdlib.h>
+#include <string.h>
#include "rsl.h"
#include "wsr88d.h"
}
-void wsr88d_load_ray_hdr(Wsr88d_ray_m31 wsr88d_ray, Ray *ray)
+void wsr88d_load_ray_hdr(Wsr88d_ray_m31 *wsr88d_ray, Ray *ray)
{
int month, day, year, hour, minute, sec;
float fsec;
Wsr88d_ray m1_ray;
Ray_header_m31 ray_hdr;
- ray_hdr = wsr88d_ray.ray_hdr;
+ ray_hdr = wsr88d_ray->ray_hdr;
m1_ray.ray_date = ray_hdr.ray_date;
m1_ray.ray_time = ray_hdr.ray_time;
ray->h.ray_num = ray_hdr.azm_num;
ray->h.elev = ray_hdr.elev;
ray->h.elev_num = ray_hdr.elev_num;
- ray->h.unam_rng = wsr88d_ray.unamb_rng;
- ray->h.nyq_vel = wsr88d_ray.nyq_vel;
+ ray->h.unam_rng = wsr88d_ray->unamb_rng;
+ ray->h.nyq_vel = wsr88d_ray->nyq_vel;
int elev_index;
elev_index = ray_hdr.elev_num - 1;
ray->h.azim_rate = vcp_data.azim_rate[elev_index];
*/
m1_ray.vol_cpat = vcp_data.vcp;
m1_ray.elev_num = ray_hdr.elev_num;
- m1_ray.unam_rng = (short) (wsr88d_ray.unamb_rng * 10.);
+ m1_ray.unam_rng = (short) (wsr88d_ray->unamb_rng * 10.);
/* Get values from message type 1 routines. */
ray->h.frequency = wsr88d_get_frequency(&m1_ray);
ray->h.pulse_width = wsr88d_get_pulse_width(&m1_ray);
#define MAXRAYS_M31 800
#define MAXSWEEPS 20
-void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
+void wsr88d_load_ray(Wsr88d_ray_m31 *wsr88d_ray,
+ Data_moment_hdr *hdr, void *data,
int isweep, int iray, Radar *radar)
{
/* Load data into ray structure for this field or data moment. */
- Data_moment_hdr data_hdr;
int ngates;
int i, hdr_size;
float value, scale, offset;
- unsigned char *data;
Range (*invf)(float x);
float (*f)(Range x);
Ray *ray;
int vol_index, waveform;
+ char *type_str;
enum waveforms {surveillance=1, doppler_w_amb_res, doppler_no_amb_res,
batch};
- /* Get data moment header. */
- hdr_size = sizeof(data_hdr);
- memcpy(&data_hdr, &wsr88d_ray.data[data_ptr], hdr_size);
- data_ptr += hdr_size;
- if (little_endian()) wsr88d_swap_data_hdr(&data_hdr);
-
- vol_index = wsr88d_get_vol_index(data_hdr.dataname);
+ vol_index = wsr88d_get_vol_index(hdr->dataname);
if (vol_index < 0) {
fprintf(stderr,"wsr88d_load_ray: Unknown dataname %s. isweep = %d, "
- "iray = %d.\n", data_hdr.dataname, isweep, iray);
+ "iray = %d.\n", hdr->dataname, isweep, iray);
return;
}
switch (vol_index) {
- case DZ_INDEX: f = DZ_F; invf = DZ_INVF; break;
- case VR_INDEX: f = VR_F; invf = VR_INVF; break;
- case SW_INDEX: f = SW_F; invf = SW_INVF; break;
- case DR_INDEX: f = DR_F; invf = DR_INVF; break;
- case PH_INDEX: f = PH_F; invf = PH_INVF; break;
- case RH_INDEX: f = RH_F; invf = RH_INVF; break;
+ case DZ_INDEX: f = DZ_F; invf = DZ_INVF; type_str = "Reflectivity"; break;
+ case VR_INDEX: f = VR_F; invf = VR_INVF; type_str = "Velocity"; break;
+ case SW_INDEX: f = SW_F; invf = SW_INVF; type_str = "Spectrum width"; break;
+ case DR_INDEX: f = DR_F; invf = DR_INVF; type_str = "Diff. Reflectivity"; break;
+ case PH_INDEX: f = PH_F; invf = PH_INVF; type_str = "Diff. Phase"; break;
+ case RH_INDEX: f = RH_F; invf = RH_INVF; type_str = "Correlation Coef"; break;
}
waveform = vcp_data.waveform[isweep];
radar->v[vol_index] = RSL_new_volume(MAXSWEEPS);
radar->v[vol_index]->h.f = f;
radar->v[vol_index]->h.invf = invf;
+ radar->v[vol_index]->h.type_str = type_str;
}
if (radar->v[vol_index]->sweep[isweep] == NULL) {
radar->v[vol_index]->sweep[isweep] = RSL_new_sweep(MAXRAYS_M31);
radar->v[vol_index]->sweep[isweep]->h.f = f;
radar->v[vol_index]->sweep[isweep]->h.invf = invf;
}
- ngates = data_hdr.ngates;
+ ngates = hdr->ngates;
ray = RSL_new_ray(ngates);
/* Convert data to float, then use range function to store in ray.
* means range folded.
*/
- offset = data_hdr.offset;
- scale = data_hdr.scale;
- if (data_hdr.scale == 0) scale = 1.0;
- data = &wsr88d_ray.data[data_ptr];
+ offset = hdr->offset;
+ scale = hdr->scale;
+ if (hdr->scale == 0) scale = 1.0;
for (i = 0; i < ngates; i++) {
- if (data[i] > 1)
- value = (data[i] - offset) / scale;
- else value = (data[i] == 0) ? BADVAL : RFVAL;
+ unsigned short datan = 0;
+ switch (hdr->datasize_bits) {
+ case 8: datan = ((unsigned char *)data)[i]; break;
+ case 16: datan = ((unsigned short *)data)[i]; break;
+ }
+ if (little_endian() && hdr->datasize_bits == 16)
+ swap_2_bytes(&datan);
+
+ if (datan > 1)
+ value = (datan - offset) / scale;
+ else value = (datan == 0) ? BADVAL : RFVAL;
+
ray->range[i] = invf(value);
ray->h.f = f;
ray->h.invf = invf;
}
wsr88d_load_ray_hdr(wsr88d_ray, ray);
- ray->h.range_bin1 = data_hdr.range_first_gate;
- ray->h.gate_size = data_hdr.range_samp_interval;
+ ray->h.range_bin1 = hdr->range_first_gate;
+ ray->h.gate_size = hdr->range_samp_interval;
ray->h.nbins = ngates;
radar->v[vol_index]->sweep[isweep]->ray[iray] = ray;
radar->v[vol_index]->sweep[isweep]->h.nrays = iray+1;
}
-void wsr88d_load_ray_into_radar(Wsr88d_ray_m31 wsr88d_ray, int isweep, int iray,
- Radar *radar)
+void wsr88d_load_ray_into_radar(Wsr88d_ray_m31 *wsr88d_ray,
+ int isweep, int iray, Radar *radar)
{
- int *data_ptr, hdr_size;
- int i, ndatablocks, nconstblocks = 3;
-
- hdr_size = sizeof(wsr88d_ray.ray_hdr);
-
- ndatablocks = wsr88d_ray.ray_hdr.data_block_count;
- data_ptr = (int *) &wsr88d_ray.ray_hdr.dbptr_ref;
- for (i=0; i < ndatablocks-nconstblocks; i++) {
- wsr88d_load_ray(wsr88d_ray, *data_ptr-hdr_size, isweep, iray, radar);
- data_ptr++;
+ int i, *offsets;
+ Data_moment_hdr *hdr;
+
+ offsets = (int *)&wsr88d_ray->ray_hdr.dbptr_vol_const;
+
+ /* skip constant data blocks */
+ for (i = 3; i < wsr88d_ray->ray_hdr.data_block_count; i++) {
+ hdr = (Data_moment_hdr*)&wsr88d_ray->data[offsets[i]-sizeof(Ray_header_m31)];
+ if (little_endian())
+ wsr88d_swap_data_hdr(hdr);
+ wsr88d_load_ray(wsr88d_ray, hdr, hdr+1, isweep, iray, radar);
}
}
}
/* Load ray into radar structure. */
- wsr88d_load_ray_into_radar(wsr88d_ray, isweep, iray, radar);
+ wsr88d_load_ray_into_radar(&wsr88d_ray, isweep, iray, radar);
iray++;
if (iray >= MAXRAYS_M31) {
fprintf(stderr,"Error: iray = %d, equals or exceeds MAXRAYS_M31"