Elaboradar  0.1
SP20read.cpp
1 /*----------------------------------------------------------------------------*/
2 /* INCLUDE file */
3 /*----------------------------------------------------------------------------*/
4 #include <stdlib.h>
5 #include <string.h>
6 #include <time.h>
7 #include "func_SP20read.h" /* file contenente i prototipi
8  delle funzioni necessarie per leggere e convertire
9  i dati dal formato nuovo SP20 al vecchio MDB */
10 
11 /* omstart ReadHeaderSP20toMDB
12  ========================================
13  | FUNZIONE ReadHeaderSP20toMDB |
14  | legge i dati nel nuovo formato, |
15  | header DBP e raggio, e li rende |
16  | compatibili con il vecchio. |
17  ========================================
18 omend */
19 
20 extern int elev_array[NEL];
21 extern int nbeam_elev[NEL];
22 unsigned char header_beam_spc_char[40];
23 
24 time_t get_date_from_name(T_MDB_data_header* old_data_header, struct tm *tm_date_ext, const char* nome_file)
25 {
26  const char *DBP={"DBP2"};
27  struct tm tm_date;
28  const char *pointer;
29  char s_date[100];
30  int year,month,day,hour,min,sec;
31 
32  time_t differenza = 10000;
33  time_t UTC_time;
34 
35  // printf("sono qui\n");
36  pointer=strstr(nome_file,DBP);
37  strncpy(s_date,pointer+5,12);
38  s_date[12]='\0';
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);
42  // printf("data %s\n",s_date);
43 
44  tm_date.tm_year=tm_date.tm_year-1900; /* Year */
45  tm_date.tm_mon=tm_date.tm_mon-1; /* Month */
46  tm_date.tm_sec=0; /* Second */
47 
48  /*------------
49  A questo punto riempio tutto la struttuta tm_date
50  ------------*/
51  tm_date.tm_isdst=0;
52  tm_date.tm_gmtoff=0;
53 
54  /*------------
55  chiamo la mktime
56  ------------*/
57  // printf("--- %s\n",asctime(&tm_date));
58  // return(1);
59 
60 
61  /*-------
62  copio la struttura tm_date nella struttura di input/output
63  --------*/
64  /* printf("%2d %2d %4d %2d %2d\n",
65  tm_date.tm_mday,tm_date.tm_mon,tm_date.tm_year,
66  tm_date.tm_hour,tm_date.tm_min);
67  */
68  //memcpy(tm_date_ext,&tm_date,sizeof(tm_date));
69 
70  /*
71  printf("%2d %2d %4d %2d %2d\n",
72  tm_date_ext->tm_mday,tm_date_ext->tm_mon,tm_date_ext->tm_year,
73  tm_date_ext->tm_hour,tm_date_ext->tm_min);
74 
75  */
76  /*-----------------------------------------
77  calcolo la differenza tra l'ora locala della macchina su cui gira l'applicativo
78  e il fuso GMT perche' mktime() restituisce i secondi lavorando sul fuso orario locale
79  -----------------------------------------------*/
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));
84  /*
85  printf ("ancora -");
86  printf("%2d %2d %4d %2d %2d -- %2d\n",
87  tm_date_ext->tm_mday,tm_date_ext->tm_mon,tm_date_ext->tm_year,
88  tm_date_ext->tm_hour,tm_date_ext->tm_min , tm_date_ext->tm_wday);
89  return (UTC_time);
90  */
91  return (UTC_time);
92  // return (mktime(tm_date_ext)+differenza);
93 
94 }
95 
96 
97 /*===============================================*/
98 int ReadHeaderSP20toMDB(T_MDB_data_header *old_header, FILE *fp)
99 /*===============================================*/
100 {
101 
102  HD_DBP_SP20_RAW hd_raw;
103  HD_DBP_SP20_DECOD hd_decod;
104  BEAM_HD_SP20_INFO beam_info;
105  int offset;
106 
107  if (fread(&hd_raw, sizeof(hd_raw), 1, fp) != 1)
108  return NO_OK;
109  decode_header_DBP_SP20 (&hd_raw, &hd_decod);
110  //printf("------------\n read header \n");
111  // PrintHeaderDBP(&hd_decod);
112 
113  while(1){
114  if (fread(header_beam_spc_char, sizeof(header_beam_spc_char), 1, fp) != 1)
115  return NO_OK;
116  decode_header_sp20(header_beam_spc_char, &beam_info);
117  //PrintHeader(&beam_info);
118 
119  offset=strlen(beam_info.quantities)*beam_info.cell_num;
120  fseek(fp,offset,SEEK_CUR);
121 
122  if (beam_info.valid_data == 'V')
123  {
124  convert_format(&hd_decod, &beam_info, old_header);
125  // PrintOldHeader (old_header);
126  // printf ("%d -- %d \n",offset,sizeof(header_beam_spc_char));
127  fseek(fp, -(offset+sizeof(header_beam_spc_char)),SEEK_CUR);
128  break;
129  }
130 
131  }
132  return OK;
133 
134 }
135 
136 /*===============================================*/
137 int ReadHeaderSP20(HD_DBP_SP20_DECOD *new_header_deco, BEAM_HD_SP20_INFO *beam_info, FILE *fp)
138 /*===============================================*/
139 {
140  HD_DBP_SP20_RAW hd_raw;
141  int offset;
142 
143  if (fread(&hd_raw, sizeof(hd_raw), 1, fp) != 1)
144  return NO_OK;
145  decode_header_DBP_SP20 (&hd_raw, new_header_deco);
146  // PrintHeaderDBP(&hd_decod);
147 
148  while(1){
149  if (fread(header_beam_spc_char, sizeof(header_beam_spc_char), 1, fp) != 1)
150  return NO_OK;
151  decode_header_sp20(header_beam_spc_char, beam_info);
152  // PrintHeader(&beam_info);
153 
154  offset=strlen(beam_info->quantities)*beam_info->cell_num;
155  fseek(fp,offset,SEEK_CUR);
156 
157  if (beam_info->valid_data == 'V')
158  {
159  // PrintOldHeader (old_header);
160  // printf ("%d -- %d \n",offset,sizeof(header_beam_spc_char));
161  fseek(fp, -(offset+sizeof(header_beam_spc_char)),SEEK_CUR);
162  break;
163  }
164  }
165  return OK;
166 
167 }
168 
169 /*===============================================*/
170 int read_dbp_SP20(
171  char *nome_file,
172  struct VOL_POL vol_pol_locale[][NUM_AZ_X_PPI],
173  T_MDB_data_header *old_data_header,
174  int tipo_dati,
175  int nbeam_elev[])
176 /*===============================================*/
177 {
178  BEAM_HD_SP20_INFO beam_info;
179  BEAM_DATA data;
180  T_MDB_ap_beam_header old_beam_header;
181  FILE *file1;
182  unsigned char dati[MAX_DIM];
183  struct tm data_nome;
184 
185  int el_num,az_num,i;
186  int new_az_num;
187  // printf(" devo leggere %s\n",nome_file);
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");
191  if(file1 == NULL )
192  {
193  fclose(file1);
194  printf("errore apertura file \n");
195  return NO_OK;
196  }
197  i = ReadHeaderSP20toMDB(old_data_header, file1);
198 
199  if( i == NO_OK)
200  {
201  fclose(file1);
202  printf("errore lettura dati\n");
203  return NO_OK;
204  }
205 
206  /*--------
207  ATTENZIONE PRENDO LA DATA DAL NOME DEL FILE
208  -------*/
209  old_data_header->norm.maq.acq_date=get_date_from_name(old_data_header,&data_nome,nome_file);
210 
211 //
212  int kk;
213 kk=0;
214 
215  while(1)
216  {
217 kk++;
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);
220 
221  if(el_num < NEL && old_beam_header.alfa < 4096)
222  {
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.)
226  {
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);
229  }
230  else if(az_num*0.9-old_beam_header.alfa*FATT_MOLT_AZ > 0.)
231  {
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);
234  }
235  }
236 // printf(" ---- %d \n",nbeam_elev[el_num]);
237  } //end while
238  fclose(file1);
239 
240  return OK;
241 
242 } //end funzione read_dbp_dbp(nome_file)
243 
244 
245 /*==================================================*/
246 void conv_ray(float *f_ray, int m, BEAM_HD_SP20_INFO *beam_info, BEAM_DATA *data)
247 /*==================================================*/
248 {
249  int p;
250  float min_zeta;
251 
252  switch(beam_info->Z_range)
253  {
254  case 'M' :
255  min_zeta=MIN20_Z;
256  break;
257  case 'L':
258  min_zeta=MIN10_Z;
259  break;
260  case 'H':
261  min_zeta=MIN30_Z;
262  break;
263  case 0 :
264  min_zeta=MIN20_Z;
265  break;
266  case 1:
267  min_zeta=MIN10_Z;
268  break;
269  case 2:
270  min_zeta=MIN30_Z;
271  break;
272  }
273  for (p=0; p<beam_info->cell_num; p++)
274  switch (m)
275  {
276  case INDEX_Z : // Riflettività Z
277  f_ray[p]=data->beam[p]*RANGE_Z/255. + min_zeta;
278  break;
279  case INDEX_ZDR : // Riflettività differenziale ZDR
280  f_ray[p]=data->beam[p]*RANGE_ZDR/255. + MIN_ZDR;
281  break;
282  case INDEX_V : // Velocità V
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;
286  else
287  f_ray[p] = data->beam_w[p] * RANGE_V2 / 127.*.5;
288  break;
289  case INDEX_SV : // Spread - Sigma V
290  f_ray[p]=data->beam[p]*RANGE_SIG_V/RANGE_BYTE +MIN_SIG_V;
291  break;
292  }
293 }
294 
295 
296 /*===============================================*/
297 void convert_format_beam(BEAM_HD_SP20_INFO *beam_info, T_MDB_ap_beam_header *old_beam_hd, int tipo_dati)
298 /*===============================================*/
299 {
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;
304 
305  return ;
306 }
307 
308 int DefIndiceDati(int tipo_dati, BEAM_HD_SP20_INFO *beam_info)
309 {
310  int i, pos=0;
311 
312  // verifico che la grandezza cercata sia presente nel file in uso
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++;
316  return pos;
317 }
318 
319 /*===============================================*/
320 int ReadBeamSP20toMDB(T_MDB_ap_beam_header *old_beam_hd, unsigned char *dati, FILE *fp, int tipo_dati)
321 /*===============================================*/
322 {
323  BEAM_HD_SP20_INFO beam_info;
324  int offset;
325  int indice_dati;
326 
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)
330  return NO_OK;
331  decode_header_sp20(header_beam_spc_char, &beam_info);
332 // convert_format_beam(&beam_info, old_beam_hd,tipo_dati);
333 // printf( "#### %d %d @@@@",old_beam_hd->teta,old_beam_hd->alfa);
334  indice_dati=DefIndiceDati(tipo_dati,&beam_info);
335  if (indice_dati == -1) return -1;
336 
337  fseek(fp,indice_dati*beam_info.cell_num,SEEK_CUR);
338  if(fread(dati, beam_info.cell_num, 1, fp)!= 1)
339  return NO_OK;
340  offset=(strlen(beam_info.quantities)-indice_dati-1)*beam_info.cell_num;
341  fseek(fp,offset,SEEK_CUR);
342  }
343 
344  convert_format_beam(&beam_info, old_beam_hd,tipo_dati);
345  return OK;
346 }
347 
348 
349 /*===============================================*/
350 int ReadBeamSP20(BEAM_HD_SP20_INFO *beam_info, unsigned char *dati, FILE *fp, int tipo_dati)
351 /*===============================================*/
352 {
353  int offset;
354  int indice_dati;
355 
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)
359  return NO_OK;
360  decode_header_sp20(header_beam_spc_char, beam_info);
361 
362  indice_dati=DefIndiceDati(tipo_dati,beam_info);
363  if (indice_dati == -1) return -1;
364 
365  fseek(fp,indice_dati*beam_info->cell_num,SEEK_CUR);
366  if(fread(dati, beam_info->cell_num, 1, fp)!= 1)
367  return NO_OK;
368  offset=(strlen(beam_info->quantities)-indice_dati-1)*beam_info->cell_num;
369  fseek(fp,offset,SEEK_CUR);
370  }
371 
372  return OK;
373 }
374 
375 
376 /*===============================================*/
377 int read_ray_SP20(T_MDB_ap_beam_header *old_beam_hd, unsigned char *dati, FILE *fp, int tipo_dati)
378 /*===============================================*/
379 {
380  T_MDB_ap_beam_header beam_header_ray[3];
381 
382  unsigned char dati_ray[3][MAX_DIM];
383  long position;
384  int i,status;
385 
386 
387  if( (status=ReadBeamSP20toMDB(old_beam_hd,dati,fp,tipo_dati))== OK)
388  {
389  if (old_beam_hd->tipo_gran != tipo_dati)
390  {
391  fclose(fp);
392  _Exit(1);
393  }
394  return OK;
395  }
396  if (status == -1) printf (" Il file dati non contiene la grandezza cercata \n");
397  return NO_OK;
398 } // end funzione
399 
400 
401  /*-------------------------------------------
402  | identifico a quale ppi appartiene il beam |
403  -------------------------------------------*/
404 /*===============================================*/
405 int elevation_index_MDB(short el)
406 /*===============================================*/
407 {
408  int i;
409  for (i=0; i<NEL; i++)
410  if(el >= (elev_array[i]-6) && el < (elev_array[i]+5)) return i;
411  return NEL;
412 }
413 
414 
415 
416 /*----------------------------
417  | identifico azimut del beam |
418  ----------------------------*/
419 /*===============================================*/
420 int azimut_index_MDB(short az)
421 /*===============================================*/
422 {
423  int i;
424  float azimut;
425  azimut = az*FATT_MOLT_AZ / .9;
426  if(azimut - (int)azimut <= .5)
427  i = (int)azimut % 400;
428  else
429  i = ((int)azimut +1) % 400;
430  return i;
431 }
432 
433 
434 
435  /*---------------------------------------------
436  | FUNCTION: clear_dbp |
437  | |
438  ---------------------------------------------
439  | Serve per ripulire il volume dati di lavoro |
440  | Pulisce anche il vettore del numero di |
441  | raggi trovato |
442  ---------------------------------------------*/
443 /*===============================================*/
444 void clear_dbp(
445  struct VOL_POL vol_pol_locale [][NUM_AZ_X_PPI],
446  int nbeam_elev[])
447 /*===============================================*/
448 {
449  memset(vol_pol_locale,0,sizeof(*vol_pol_locale));
450  memset(nbeam_elev,0,sizeof(*nbeam_elev));
451  return;
452 }
453 
454 
455 /*====================================================================*/
456 void 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[])
457 /*====================================================================*/
458 {
459  int i;
460 
461  if(raggio->flag == 0)
462  {
463  for(i=0; i< old_beam_header.max_bin; i++)
464  {
465  if(dati[i])
466  raggio->ray[i] = dati[i];
467  else
468  raggio->ray[i] = 1;
469  }
470  nbeam_elev[el_num]++;
471  }
472  else
473  for(i=0; i< old_beam_header.max_bin; i++)
474  if(raggio->ray[i]<dati[i])
475  raggio->ray[i]=dati[i];
476  raggio->flag=1;
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;
483 }
484