20extern int elev_array[NEL];
21extern int nbeam_elev[NEL];
22unsigned char header_beam_spc_char[40];
24time_t get_date_from_name(T_MDB_data_header* old_data_header,
struct tm *tm_date_ext,
const char* nome_file)
26 const char *DBP={
"DBP2"};
30 int year,month,day,hour,min,sec;
32 time_t differenza = 10000;
36 pointer=strstr(nome_file,DBP);
37 strncpy(s_date,pointer+5,12);
39 sscanf(s_date,
"%2d%2d%4d%2d%2d",
40 &tm_date.tm_mday,&tm_date.tm_mon,&tm_date.tm_year,
41 &tm_date.tm_hour,&tm_date.tm_min);
44 tm_date.tm_year=tm_date.tm_year-1900;
45 tm_date.tm_mon=tm_date.tm_mon-1;
80 differenza = differenza-mktime(gmtime(&differenza));
81 UTC_time=(mktime(&tm_date)+differenza);
82 tm_date= *(gmtime(&UTC_time));
83 memcpy(tm_date_ext,&tm_date,
sizeof(tm_date));
98int ReadHeaderSP20toMDB(T_MDB_data_header *old_header, FILE *fp)
102 HD_DBP_SP20_RAW hd_raw;
103 HD_DBP_SP20_DECOD hd_decod;
104 BEAM_HD_SP20_INFO beam_info;
107 if (fread(&hd_raw,
sizeof(hd_raw), 1, fp) != 1)
109 decode_header_DBP_SP20 (&hd_raw, &hd_decod);
114 if (fread(header_beam_spc_char,
sizeof(header_beam_spc_char), 1, fp) != 1)
116 decode_header_sp20(header_beam_spc_char, &beam_info);
119 offset=strlen(beam_info.quantities)*beam_info.cell_num;
120 fseek(fp,offset,SEEK_CUR);
122 if (beam_info.valid_data ==
'V')
124 convert_format(&hd_decod, &beam_info, old_header);
127 fseek(fp, -(offset+
sizeof(header_beam_spc_char)),SEEK_CUR);
137int ReadHeaderSP20(HD_DBP_SP20_DECOD *new_header_deco, BEAM_HD_SP20_INFO *beam_info, FILE *fp)
140 HD_DBP_SP20_RAW hd_raw;
143 if (fread(&hd_raw,
sizeof(hd_raw), 1, fp) != 1)
145 decode_header_DBP_SP20 (&hd_raw, new_header_deco);
149 if (fread(header_beam_spc_char,
sizeof(header_beam_spc_char), 1, fp) != 1)
151 decode_header_sp20(header_beam_spc_char, beam_info);
154 offset=strlen(beam_info->quantities)*beam_info->cell_num;
155 fseek(fp,offset,SEEK_CUR);
157 if (beam_info->valid_data ==
'V')
161 fseek(fp, -(offset+
sizeof(header_beam_spc_char)),SEEK_CUR);
172 struct VOL_POL vol_pol_locale[][NUM_AZ_X_PPI],
173 T_MDB_data_header *old_data_header,
178 BEAM_HD_SP20_INFO beam_info;
180 T_MDB_ap_beam_header old_beam_header;
182 unsigned char dati[MAX_DIM];
188 clear_dbp(vol_pol_locale,nbeam_elev);
189 if(access(nome_file,R_OK) == -1)
return NO_OK;
190 file1=fopen(nome_file,
"rb");
194 printf(
"errore apertura file \n");
197 i = ReadHeaderSP20toMDB(old_data_header, file1);
202 printf(
"errore lettura dati\n");
209 old_data_header->norm.maq.acq_date=get_date_from_name(old_data_header,&data_nome,nome_file);
218 if(read_ray_SP20(&old_beam_header,dati,file1,tipo_dati)==NO_OK)
break;
219 el_num = elevation_index_MDB(old_beam_header.teta);
221 if(el_num < NEL && old_beam_header.alfa < 4096)
223 az_num = azimut_index_MDB(old_beam_header.alfa);
224 fill_beam(&vol_pol_locale[el_num][az_num],az_num,el_num,old_beam_header,dati,nbeam_elev);
225 if(az_num*0.9-old_beam_header.alfa*FATT_MOLT_AZ < 0.)
227 new_az_num = (az_num +1) %400;
228 fill_beam(&vol_pol_locale[el_num][new_az_num], new_az_num,el_num,old_beam_header,dati,nbeam_elev);
230 else if(az_num*0.9-old_beam_header.alfa*FATT_MOLT_AZ > 0.)
232 new_az_num = (az_num -1+400) %400;
233 fill_beam(&vol_pol_locale[el_num][new_az_num], new_az_num, el_num, old_beam_header,dati,nbeam_elev);
246void conv_ray(
float *f_ray,
int m, BEAM_HD_SP20_INFO *beam_info, BEAM_DATA *data)
252 switch(beam_info->Z_range)
273 for (p=0; p<beam_info->cell_num; p++)
277 f_ray[p]=data->beam[p]*RANGE_Z/255. + min_zeta;
280 f_ray[p]=data->beam[p]*RANGE_ZDR/255. + MIN_ZDR;
283 if (data->beam_w[p] == -128) data->beam_w[p] = -127;
284 if ( beam_info->PRF ==
'S')
285 f_ray[p] = data->beam_w[p] * RANGE_V / 127.*.5;
287 f_ray[p] = data->beam_w[p] * RANGE_V2 / 127.*.5;
290 f_ray[p]=data->beam[p]*RANGE_SIG_V/RANGE_BYTE +MIN_SIG_V;
297void convert_format_beam(BEAM_HD_SP20_INFO *beam_info, T_MDB_ap_beam_header *old_beam_hd,
int tipo_dati)
300 old_beam_hd->max_bin=beam_info->cell_num;
301 old_beam_hd->teta=beam_info->elevation/FATT_MOLT_EL;
302 old_beam_hd->alfa=beam_info->azimuth/FATT_MOLT_EL;
303 old_beam_hd->tipo_gran=tipo_dati;
308int DefIndiceDati(
int tipo_dati, BEAM_HD_SP20_INFO *beam_info)
313 if (!beam_info->flag_quantities[tipo_dati])
return -1;
314 for (i=0;i<tipo_dati;i++)
315 if (beam_info->flag_quantities[i])pos++;
320int ReadBeamSP20toMDB(T_MDB_ap_beam_header *old_beam_hd,
unsigned char *dati, FILE *fp,
int tipo_dati)
323 BEAM_HD_SP20_INFO beam_info;
327 beam_info.valid_data=0;
328 while(!beam_info.valid_data){
329 if (fread(header_beam_spc_char,
sizeof(header_beam_spc_char), 1, fp) != 1)
331 decode_header_sp20(header_beam_spc_char, &beam_info);
334 indice_dati=DefIndiceDati(tipo_dati,&beam_info);
335 if (indice_dati == -1)
return -1;
337 fseek(fp,indice_dati*beam_info.cell_num,SEEK_CUR);
338 if(fread(dati, beam_info.cell_num, 1, fp)!= 1)
340 offset=(strlen(beam_info.quantities)-indice_dati-1)*beam_info.cell_num;
341 fseek(fp,offset,SEEK_CUR);
344 convert_format_beam(&beam_info, old_beam_hd,tipo_dati);
350int ReadBeamSP20(BEAM_HD_SP20_INFO *beam_info,
unsigned char *dati, FILE *fp,
int tipo_dati)
356 beam_info->valid_data=0;
357 while(!beam_info->valid_data){
358 if (fread(header_beam_spc_char,
sizeof(header_beam_spc_char), 1, fp) != 1)
360 decode_header_sp20(header_beam_spc_char, beam_info);
362 indice_dati=DefIndiceDati(tipo_dati,beam_info);
363 if (indice_dati == -1)
return -1;
365 fseek(fp,indice_dati*beam_info->cell_num,SEEK_CUR);
366 if(fread(dati, beam_info->cell_num, 1, fp)!= 1)
368 offset=(strlen(beam_info->quantities)-indice_dati-1)*beam_info->cell_num;
369 fseek(fp,offset,SEEK_CUR);
377int read_ray_SP20(T_MDB_ap_beam_header *old_beam_hd,
unsigned char *dati, FILE *fp,
int tipo_dati)
380 T_MDB_ap_beam_header beam_header_ray[3];
382 unsigned char dati_ray[3][MAX_DIM];
387 if( (status=ReadBeamSP20toMDB(old_beam_hd,dati,fp,tipo_dati))== OK)
389 if (old_beam_hd->tipo_gran != tipo_dati)
396 if (status == -1) printf (
" Il file dati non contiene la grandezza cercata \n");
405int elevation_index_MDB(
short el)
409 for (i=0; i<NEL; i++)
410 if(el >= (elev_array[i]-6) && el < (elev_array[i]+5))
return i;
420int azimut_index_MDB(
short az)
425 azimut = az*FATT_MOLT_AZ / .9;
426 if(azimut - (
int)azimut <= .5)
427 i = (int)azimut % 400;
429 i = ((int)azimut +1) % 400;
445 struct VOL_POL vol_pol_locale [][NUM_AZ_X_PPI],
449 memset(vol_pol_locale,0,
sizeof(*vol_pol_locale));
450 memset(nbeam_elev,0,
sizeof(*nbeam_elev));
456void fill_beam(
struct VOL_POL *raggio,
int az_num,
int el_num, T_MDB_ap_beam_header old_beam_header,
unsigned char *dati,
int nbeam_elev[])
461 if(raggio->flag == 0)
463 for(i=0; i< old_beam_header.max_bin; i++)
466 raggio->ray[i] = dati[i];
470 nbeam_elev[el_num]++;
473 for(i=0; i< old_beam_header.max_bin; i++)
474 if(raggio->ray[i]<dati[i])
475 raggio->ray[i]=dati[i];
477 raggio->b_header.alfa =(short)(az_num*.9/FATT_MOLT_AZ);
478 raggio->b_header.teta = elev_array[el_num];
479 raggio->alfa_true =old_beam_header.alfa;
480 raggio->teta_true =old_beam_header.teta;
481 raggio->b_header.tipo_gran = old_beam_header.tipo_gran;
482 raggio->b_header.max_bin = old_beam_header.max_bin;