Elaboradar 0.1
Caricamento in corso...
Ricerca in corso...
Nessun risultato
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 ========================================
18omend */
19
20extern int elev_array[NEL];
21extern int nbeam_elev[NEL];
22unsigned char header_beam_spc_char[40];
23
24time_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/*===============================================*/
98int 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/*===============================================*/
137int 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/*===============================================*/
170int 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;
213kk=0;
214
215 while(1)
216 {
217kk++;
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/*==================================================*/
246void 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/*===============================================*/
297void 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
308int 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/*===============================================*/
320int 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/*===============================================*/
350int 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/*===============================================*/
377int 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/*===============================================*/
405int 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/*===============================================*/
420int 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/*===============================================*/
444void 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/*====================================================================*/
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[])
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