}
-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;
- void *data;
Range (*invf)(float x);
float (*f)(Range x);
Ray *ray;
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) {
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++) {
unsigned short datan = 0;
- switch (data_hdr.datasize_bits) {
+ switch (hdr->datasize_bits) {
case 8: datan = ((unsigned char *)data)[i]; break;
case 16: datan = ((unsigned short *)data)[i]; break;
}
- if (little_endian() && data_hdr.datasize_bits == 16)
+ if (little_endian() && hdr->datasize_bits == 16)
swap_2_bytes(&datan);
if (datan > 1)
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"