Daily_QC
display_data.c
Go to the documentation of this file.
1 #include "prototypes_new.h"
2 
4 extern XFontStruct *info_font[10];
5 extern Font font[10];
6 extern int init_subdisplay;
7 extern Display *display;
8 extern Window bwindow[20],root_win;
9 extern struct save_rec save_rec[20];
10 extern char qual[10];
11 extern int display_method;
12 extern Widget bdrawing_area[10];
13 extern Widget draw_dialog[10];
14 extern Widget top_level;
15 extern Widget bmain_window;
16 extern unsigned long mmap[16];
17 GC gc1;
18 
19 static int bmax_width=600,bmax_height=400,depth,scale=0,linear=0;
20 struct stim btim;
21 struct stim etim;
22 void options_draw();
23 void quit_draw();
26 char pe2;
27 struct stn_rec stn_rec;
28 int dbase;
29 char qual[10];
31 
32 void display_data(char *hb5,char *pc,int dmonth,int dday,int dyear,int dhour,
33  int ddays)
34 
35 {
36 
37 int i;
38 time_t tim;
39 struct tm *gmtim;
40 Cardinal argcount;
41 Arg args[10];
42 
43 month=dmonth;
44 day=dday;
45 year=dyear;
46 hour=dhour;
47 days=ddays;
48 
49 if(init_subdisplay == 0) {
50 
51  stn_values=calloc(10000,sizeof(struct stn_values));
52 
53  for(i=0;i<10;i++) {
54 
55  draw_dialog[i]=0;
56  save_rec[i].inum=-1;
57  save_rec[i].volume=0;
58 
59 
60  }
61 
62  gc1= XCreateGC(display,root_win,0,0);
63 
64  init_subdisplay=1;
65 
66 }
67 
68 btim.year=year;
70 btim.day=day;
71 btim.hour=hour;
72 
74 
75 tim=tim-days*86400L;
76 gmtim=gmtime(&tim);
77 
78 etim.year=gmtim->tm_year+1900;
79 etim.month=gmtim->tm_mon+1;
80 etim.day=gmtim->tm_mday;
81 etim.hour=gmtim->tm_hour;
82 
83 get_new_values(etim,btim,hb5,pc);
84 
85 }
86 
87 void get_new_values(struct stim etim,struct stim btim,char *hb5, char *pc)
88 
89 {
90 
91 struct MenuItem items[10];
92 int j,inum,i,ier,ierr,qflow,len,k;
93 char *text,buf[300],sbuf[150],hbuf[10];
94 char *spaces;
95 Cardinal argcount;
96 Dimension width,height;
97 Arg args[10];
98 Widget menu_bar,main_bar,jwidget;
99 XmString cancel,file_string,print_string;
101 double qstage;
102 char *p;
103 int num,intbuf[10];
104 int ok_num;
105 char quality;
106 Display *disp;
107 char fbuf[100];
108 FILE *fp;
109 
110 spaces=" ";
111 
112 file_string=XmStringCreateLocalized("file");
113 print_string=XmStringCreateLocalized("print");
114 cancel=XmStringCreateLocalized("quit");
115 
117 
118 for(j=0;j<10;j++){
119 
120  if(draw_dialog[j]==0)
121  break;
122 
123  }
124 
125  if(j==10) {
126 
127  berror(top_level,"No creation space");
128  return;
129 
130  }
131 
132 
133 if(display_method==1) {
134 
135  disp=XtDisplay(top_level);
136 
137  argcount=0;
138  draw_dialog[j]=XmCreateMessageDialog(top_level,"Selection list",
139  args,argcount);
140 
141 
142  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
143  XmDIALOG_OK_BUTTON));
144  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
145  XmDIALOG_HELP_BUTTON));
146  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
147  XmDIALOG_CANCEL_BUTTON));
148  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
149  XmDIALOG_SEPARATOR));
150 
151  argcount=0;
152  XtSetArg(args[argcount],XmNwidth,bmax_width);argcount++;
153  XtSetArg(args[argcount],XmNheight,bmax_height);argcount++;
154  XtSetArg(args[argcount],XmNbackground,0);argcount++;
155  bmain_window=XmCreateMainWindow(draw_dialog[j],"Main",
156  args,argcount);
157 
158  XtManageChild(bmain_window);
159 
160  argcount=0;
161  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
162  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
163  menu_bar=XmCreateMenuBar(bmain_window,"Menubar",args,argcount);
164  XtManageChild(menu_bar);
165 
166  argcount=0;
167  XtSetArg(args[argcount],XmNwidth, bmax_width);argcount++;
168  XtSetArg(args[argcount],XmNheight,bmax_height);argcount++;
169  XtSetArg(args[argcount],XmNresizePolicy,XmRESIZE_ANY);argcount++;
170  XtSetArg(args[argcount],XmNbackground,0);argcount++;
171  bdrawing_area[j]=XmCreateDrawingArea(bmain_window,"bdrawing_area",
172  args,argcount);
173 
174  XtManageChild(bdrawing_area[j]);
175 
176  XmMainWindowSetAreas(bmain_window,menu_bar,NULL,NULL,NULL,
177  bdrawing_area[j]);
178 
179  items[0].label="Quit";
180  items[0].callback=quit_draw;
181  items[0].callback_data=(XtPointer)j;
182  items[1].label=NULL;
183 
184  main_bar=BuildPulldownPushMenu(menu_bar,"File",'M',items);
185  jwidget=AttachToCascade(menu_bar,"File",main_bar);
186 
187  items[0].label="Linear stage";
188  items[0].callback=options_draw;
189  items[0].callback_data=(XtPointer)(0+j*100);
190  items[1].label="Linear flow";
191  items[1].callback=options_draw;
192  items[1].callback_data=(XtPointer)(1+j*100);
193  items[2].label="Scale to data";
194  items[2].callback=options_draw;
195  items[2].callback_data=(XtPointer)(2+j*100);
196  items[3].label="Scale to flood";
197  items[3].callback=options_draw;
198  items[3].callback_data=(XtPointer)(3+j*100);
199  items[4].label=NULL;
200 
201  main_bar=BuildPulldownPushMenu(menu_bar,"Options",'M',items);
202  jwidget=AttachToCascade(menu_bar,"Options",main_bar);
203 
204  XtManageChild(draw_dialog[j]);
205 
206  bwindow[j]=XtWindow(bdrawing_area[j]);
207 
208  XmUpdateDisplay(bdrawing_area[j]);
209 
210  sprintf(fbuf,"/usr/local/apps/mm/monthly_qc/data/scratch.%d",
211  j);
212 
213  sprintf(sbuf,"get_data %s %s %d %d %d %d %d %s",
214  hb5,pc,month,day,year,hour,days,fbuf);
215 
216  system(sbuf);
217 
218  fp=fopen(fbuf,"r");
219  inum=0;
220  ier=-1;
221 
222  if(fp!=NULL) {
223 
224  fread(&stn_rec,sizeof(struct stn_rec),1,fp);
225  fread(&inum,sizeof(int),1,fp);
226  for(k=0;k<inum;k++)
227  fread(&stn_values[k],sizeof(struct stn_values),1,fp);
228 
229  fread(&ier,sizeof(int),1,fp);
230  if(ier==1)
231  fread(&rate_table,sizeof(RatingTable),1,fp);
232 
233 
234  fclose(fp);
235 
236  }
237 
238  /* need stn_rec array */
239  /* stn_values structure */
240  /* inum */
241  /* inum stn values*/
242  /* rate_table array*/
243 
244  if(ier!=1)
245  rate_table.AryMax=-1;
246 
247  if(ier==1 && toupper(pc[0])=='Q')
248  to_stage(hb5,'H','G',stn_values,inum);
249 
250  save_rec[j].is_realized=-1;
251 
252  memcpy(&save_rec[j].stn_rec,&stn_rec,sizeof(struct stn_rec));
253  memcpy(&save_rec[j].parm,pc,10);
254  memcpy(&save_rec[j].btim,&btim,sizeof(struct stim));
255  memcpy(&save_rec[j].etim,&etim,sizeof(struct stim));
256  memcpy(&save_rec[j].stn_values,stn_values,
257  inum*sizeof(struct stn_values));
258 
259  memcpy(&save_rec[j].rate_table,&rate_table,sizeof(RatingTable));
260 
261  save_rec[j].inum=inum;
262 
263  save_rec[j].volume=0;
264 
265  if(save_rec[j].parm[2]=='M')
266  save_rec[j].volume=24*30;
267 
268  if(save_rec[j].parm[2]=='D')
269  save_rec[j].volume=24;
270 
271  else if(save_rec[j].parm[2]=='Q')
272  save_rec[j].volume=6;
273 
274  else if(save_rec[j].parm[2]=='H')
275  save_rec[j].volume=1;
276 
277  XSetFunction(display,gc1,GXcopy);
278  XSetForeground(display,gc1,mmap[0]);
279  XSetBackground(display,gc1,mmap[0]);
280  XFillRectangle(display,bwindow[j],gc1,0,0,
282 
283  XtSetArg(args[0],XtNwidth,&width);
284  XtSetArg(args[1],XtNheight,&height);
285  XtGetValues(bdrawing_area[j],args,2);
286 
287  draw_area(j,j,0,0,width,height);
288 
289  XmStringFree(file_string);
290  XmStringFree(print_string);
291  XmStringFree(cancel);
292 
293  XtAddCallback(bdrawing_area[j],XmNexposeCallback,bhandle_expose,
294  (XtPointer)j);
295 
296  XtAddCallback(bdrawing_area[j],XmNresizeCallback,bhandle_expose,
297  (XtPointer)j);
298 
299  return;
300 
301  }
302 
303 }
304 
305 
306 void draw_area(int k,int m,int xs,int ys,int xz,int yz)
307 
308 {
309 
310 int xparm1,yparm1,xparm2,yparm2;
311 int width,height;
312 struct tm tm;
313 time_t lbtim,letim,stim,otim;
314 char abuf[100],tbuf[100];
315 int xmax,ymax,xmin,ymin,maxtimes,maxvalues,yheight;
316 struct max_min max_min;
317 int deltat,i,text_width,j,h,qflag,ier;
318 float deltav,fminv;
319 float fxvalue,fyvalue,svalue,dxvalue;
320 int maxv,minv,smaxv,sminv,dvalue;
321 int xvalue,oday,yvalue,xvalue1,yvalue1,totlin,totdays,hour,ierr,flow,ilinear;
322 struct tm *gm;
323 char buf[200],ubuf[50],xbuf[50];
324 int inum,merr,ybegin,len;
325 XRectangle rect[1];
326 double stage,wrn,fld,abs1,abs2;
327 struct stn_values values[10000];
328 int htflag;
329 int line_width,line_style,cap_style,join_style,lines;
330 int totyears;
331 char oqual;
332 ilinear=linear;
333 
334 
335 pe2='G';
336 
337 if(save_rec[k].parm[1]=='P')
338  pe2='P';
339 
340 inum=save_rec[k].inum;
341 
342 memcpy(&values,&save_rec[k].stn_values,
343  inum*sizeof(struct stn_values));
344 
345 XSetFont(display,gc1,font[1]);
346 yheight=info_font[1]->ascent;
347 
348 rect[0].x=xs;
349 rect[0].y=ys;
350 rect[0].width=xz;
351 rect[0].height=yz;
352 
353 XSetFunction(display,gc1,GXcopy);
354 XSetForeground(display,gc1,mmap[0]);
355 XSetBackground(display,gc1,mmap[0]);
356 XSetClipRectangles(display,gc1,0,0,rect,1,Unsorted);
357 
358 width=xs+xz;
359 height=ys+yz;
360 
361 xparm1=75;
362 yparm1=yheight*5;
363 xparm2=75;
364 yparm2=yheight*3;
365 
366 XSetForeground(display,gc1,mmap[3]);
367 
368 XDrawLine(display,bwindow[m],gc1,xs+xparm1,height-yparm2,width-xparm1,
369  height-yparm2);
370 
371 XDrawLine(display,bwindow[m],gc1,xs+xparm1,ys+yparm1,width-xparm1,
372  ys+yparm1);
373 
374 XDrawLine(display,bwindow[m],gc1,xs+xparm1,ys+yparm1,xs+xparm1,
375  height-yparm2);
376 XDrawLine(display,bwindow[m],gc1,width-xparm1,ys+yparm1,width-xparm1,
377  height-yparm2);
378 
379 xmin=xs+xparm1+10;
380 xmax=width-xparm1-10;
381 ymin=ys+yparm1+10;
382 ymax=height-yparm2-10;
383 
384 XSetForeground(display,gc1,mmap[7]);
385 
386 if(inum==-1) {
387 
388  sprintf(buf,"%s %s not found in database",
390 
391  XDrawString(display,bwindow[m],gc1,(xmax+xmin-200)/2,
392  (ymax+ymin)/2,buf,strlen(buf));
393 
394  return;
395 
396  }
397 
398 XSetForeground(display,gc1,mmap[3]);
399 
400 sprintf(buf,"%s",save_rec[k].stn_rec.des);
401 
402 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*4,
403  buf,strlen(buf));
404 
405 strcpy(tbuf,save_rec[k].parm);
406 
407 get_acronym(tbuf,abuf);
408 sprintf(buf,"%s %s %s",save_rec[k].stn_rec.id,tbuf,abuf);
409 
410 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*3,
411  buf,strlen(buf));
412 
413 if(inum==0) {
414 
415  strcpy(buf,"NO DATA");
416 
417  XDrawString(display,bwindow[m],gc1,(xmax+xmin)/2,(ymax+ymin)/2,
418  buf,strlen(buf));
419 
420  save_rec[k].is_realized=1;
421  return;
422 
423  }
424 
425 tm.tm_sec=0;
426 tm.tm_min=0;
427 tm.tm_hour=save_rec[k].btim.hour;
428 tm.tm_mday=save_rec[k].btim.day;
429 tm.tm_mon=save_rec[k].btim.month;
430 tm.tm_year=save_rec[k].btim.year;
431 
432 lbtim=ouptime(tm.tm_year,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
433 
434 tm.tm_sec=0;
435 tm.tm_min=0;
436 tm.tm_hour=save_rec[k].etim.hour;
437 tm.tm_mday=save_rec[k].etim.day;
438 tm.tm_mon=save_rec[k].etim.month;
439 tm.tm_year=save_rec[k].etim.year;
440 
441 letim=ouptime(tm.tm_year,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
442 
443 if(save_rec[k].parm[2]=='M') {
444 
445  totlin=(lbtim-letim)/(24L*3600L)+1;
446  deltat=24;
447  totyears=(lbtim-letim)/(24L*3600L*365L)+1;
448  hour=0;
449 
450  }
451 
452 else {
453 
454  hour=0;
455 
456  if(tm.tm_hour > 0 && tm.tm_hour <=6)
457  hour=6-tm.tm_hour;
458 
459  else if(tm.tm_hour > 6 && tm.tm_hour <=12)
460  hour=12-tm.tm_hour;
461 
462  else if(tm.tm_hour > 12 && tm.tm_hour <=18)
463  hour=18-tm.tm_hour;
464 
465  else if(tm.tm_hour > 18)
466  hour=24-tm.tm_hour;
467 
468  deltat=get_delta_time(lbtim,letim);
469 
470  htflag=0;
471 
472  if(deltat>=24)
473  htflag=1;
474 
475  maxtimes=(lbtim-letim)/(deltat*3600L);
476 
477  totdays=(lbtim-letim)/(24L*3600L)+1;
478 
479  totlin=totdays*24/deltat+4;
480 
481 
482  }
483 
484 oday=-1;
485 
486 XSetForeground(display,gc1,mmap[2]);
487 
488 
489 for(i=0;i<=totlin;i++) {
490 
491  stim=letim+((i-4)*deltat*3600L) + hour*3600L;
492 
493  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
494  (float)(letim-stim);
495 
496  xvalue=fxvalue;
497 
498  if(xvalue > width-xparm1)
499  break;
500 
501  if(xvalue < xs+xparm1)
502  continue;
503 
504  gm=gmtime(&stim);
505 
506  if(save_rec[k].parm[2]=='M'){
507 
508  if(gm->tm_mday==1 && gm->tm_mon==0) {
509 
510  XDrawLine(display,bwindow[m],gc1,xvalue,ys+yparm1,
511  xvalue,height-yparm2);
512 
513  if(totyears < 5)
514  sprintf(buf,"%d/%d",gm->tm_mon+1,gm->tm_year);
515 
516  else
517  sprintf(buf,"%d",gm->tm_year);
518 
519  text_width=XTextWidth(info_font[1],buf,strlen(buf));
520  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
521  height-yparm2+yheight*2,buf,strlen(buf));
522 
523 
524  }
525 
526  else if(gm->tm_mday==1 && totyears < 2) {
527 
528  sprintf(buf,"%d",gm->tm_mon+1);
529  text_width=XTextWidth(info_font[1],buf,strlen(buf));
530  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
531  height-yparm2+yheight*2,buf,strlen(buf));
532 
533 
534  }
535 
536 
537  continue;
538 
539 
540  }
541 
542  XDrawLine(display,bwindow[m],gc1,xvalue,ys+yparm1,
543  xvalue,height-yparm2);
544 
545  if(oday != gm->tm_mday) {
546 
547  if(gm->tm_hour==0 || htflag==1) {
548 
549  sprintf(buf,"%d/%d",gm->tm_mon+1,gm->tm_mday);
550  text_width=XTextWidth(info_font[1],buf,strlen(buf));
551  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
552  height-yparm2+yheight*2,buf,strlen(buf));
553 
554  oday=gm->tm_mday;
555 
556  }
557 
558  }
559 
560  h=gm->tm_hour;
561 
562  qflag=0;
563 
564  if(deltat==1) {
565 
566  if(h==0 || h==2 || h==4 || h==6 || h==8 ||
567  h==10 || h==12 || h==14 || h==16 ||
568  h==18 || h==20 || h==22)
569  qflag=1;
570 
571  }
572 
573  else if(deltat==3 && totdays <= 2) {
574 
575 
576  if(h==0 || h==3 || h==6 || h==9 || h==12 ||
577  h==15 || h==18 || h==21)
578  qflag=1;
579 
580  }
581 
582  else if(deltat==3) {
583 
584  if(h==0 || h==6 || h==12 || h==18)
585  qflag=1;
586 
587  }
588 
589  else if(deltat==6) {
590 
591  if(h==0 || h==12)
592  qflag=1;
593 
594  }
595 
596  else if(deltat==24) {
597 
598  if(h==12)
599  qflag=1;
600 
601  }
602 
603  if(qflag==0)
604  continue;
605 
606  sprintf(buf,"%d",gm->tm_hour);
607  text_width=XTextWidth(info_font[1],buf,strlen(buf));
608  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
609  height-yparm2+yheight,buf,strlen(buf));
610 
611  }
612 
613 
614 
615 max_min=get_max_min(values,inum);
616 maxv=max_min.max + 1;
617 
618 minv=max_min.min - 1;
619 
620 if(maxv-max_min.max < .4)
621  maxv++;
622 
623 if(minv-max_min.min > .4)
624  minv--;
625 
626 if(save_rec[k].volume!=0)
627  minv=0;
628 
629 if(scale==1 && save_rec[k].rate_table.AryMax >= 0) {
630 
631  fminv=GetStage(save_rec[k].stn_rec.id,'H',
632  pe2,values[0].zdate,0,
633  &ierr);
634 
635  if(ierr >= 0 && ierr <= 2)
636  minv=fminv;
637 
638 
639  else
640  minv=save_rec[k].rate_table.RatStg[0];
641 
642 
643  }
644 
645 if(scale==1 && save_rec[k].rate_table.AryMax >= 0) {
646 
647  if(save_rec[k].rate_table.fld > 0 &&
649  maxv= save_rec[k].rate_table.fld + 2;
650 
651  else if(save_rec[k].rate_table.wrn > 0 &&
653  maxv= save_rec[k].rate_table.wrn + 2;
654 
655  }
656 
657 if(ilinear==1 && save_rec[k].rate_table.AryMax >= 0) {
658 
659  sminv=minv;
660  smaxv=maxv;
661 
662  minv=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
663  values[0].zdate,(double)minv,
664  &ierr);
665 
666  maxv=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
667  values[0].zdate,(double)maxv,
668  &merr);
669 
670  if(ierr == 3 || merr == 3) {
671 
672  ilinear=0;
673  minv=sminv;
674  maxv=smaxv;
675 
676  }
677 
678  }
679 
680 
681 deltav=get_delta_valu(maxv-minv);
682 maxvalues=(maxv-minv)/(deltav);
683 
684 lines=0;
685 
686 for(i=0;i<=maxvalues+2;i++) {
687 
688  svalue=(float)minv+(i*deltav);
689  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
690  (float)(svalue-minv);
691 
692  yvalue=fyvalue;
693  if(yvalue < ys+yparm1 || yvalue > height-yparm2)
694  continue;
695 
696  XSetForeground(display,gc1,mmap[2]);
697 
698  if(lines==0 && save_rec[k].volume != 0)
699  XSetForeground(display,gc1,mmap[9]);
700 
701  else
702  XSetForeground(display,gc1,mmap[2]);
703  lines++;
704 
705  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
706  width-xparm1,yvalue);
707 
708  if(ilinear==0 || (ilinear==1 &&
709  save_rec[k].rate_table.AryMax < 0)) {
710 
711  XSetForeground(display,gc1,mmap[2]);
712  sprintf(buf,"%6.1f",svalue);
713 
714  xvalue=width-xparm1+2;
715 
716  }
717 
718  else {
719 
720  flow=(int)svalue;
721 
722  sprintf(buf,"%d",flow);
723 
724  text_width=XTextWidth(info_font[1],buf,strlen(buf));
725 
726  xvalue=xs+xparm1-text_width;
727 
728  XSetForeground(display,gc1,mmap[2]);
729 
730  }
731 
732  for(j=0;j<6;j++)
733  if(buf[j] != ' ')
734  break;
735 
736  XDrawString(display,bwindow[m],gc1,xvalue,
737  yvalue+yheight/2,&buf[j],strlen(&buf[j]));
738 
739  if(save_rec[k].rate_table.AryMax < 0)
740  continue;
741 
742  if(ilinear==0 || (ilinear==1 &&
743  save_rec[k].rate_table.AryMax < 0))
744  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
745  values[0].zdate,(double)svalue,
746  &ierr);
747 
748  else {
749 
750  stage=GetStage(save_rec[k].stn_rec.id,'H',
751  pe2,values[0].zdate,
752  (int)svalue,&ierr);
753 
754  svalue=stage;
755 
756 
757  }
758 
759  if(ilinear==1 && save_rec[k].rate_table.AryMax >= 0) {
760 
761  XSetForeground(display,gc1,mmap[2]);
762  sprintf(buf,"%6.1f",svalue);
763  xvalue=width-xparm1+2;
764 
765  }
766 
767  else {
768 
769  sprintf(buf,"%d",flow);
770  text_width=XTextWidth(info_font[1],buf,strlen(buf));
771  xvalue=xs+xparm1-text_width;
772 
773  XSetForeground(display,gc1,mmap[2]);
774 
775  }
776 
777  for(j=0;j<6;j++)
778  if(buf[j] != ' ')
779  break;
780 
781  XDrawString(display,bwindow[m],gc1,xvalue,
782  yvalue+yheight/2,&buf[j],strlen(&buf[j]));
783 
784 }
785 
786 line_width=1;
787 line_style=LineOnOffDash;
788 cap_style=CapRound;
789 join_style=JoinRound;
790 
791 XSetLineAttributes(display,gc1,line_width,line_style,
792  cap_style,join_style);
793 
794 if(save_rec[k].rate_table.AryMax >= 0 &&
795  save_rec[k].rate_table.wrn > 0 ) {
796 
797  if(ilinear==0)
798  wrn=save_rec[k].rate_table.wrn;
799 
800  else {
801 
802  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
803  values[0].zdate,
804  (double)save_rec[k].rate_table.wrn,
805  &ierr);
806 
807  wrn=(double)flow;
808 
809  }
810 
811  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
812  (float)(wrn-minv);
813 
814  yvalue=fyvalue;
815 
816  XSetForeground(display,gc1,mmap[5]);
817 
818 
819  line_width=1;
820  line_style=LineOnOffDash;
821  cap_style=CapRound;
822  join_style=JoinRound;
823 
824  XSetLineAttributes(display,gc1,line_width,line_style,
825  cap_style,join_style);
826 
827  if(yvalue > ys+yparm1 &&
828  yvalue < height-yparm2)
829  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
830  width-xparm1,yvalue);
831 
832 
833  }
834 
835 if(save_rec[k].rate_table.AryMax >= 0 &&
836  save_rec[k].rate_table.fld > 0 ) {
837 
838  if(ilinear==0)
839  fld=save_rec[k].rate_table.fld;
840 
841  else {
842 
843  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
844  values[0].zdate,
845  (double)save_rec[k].rate_table.fld,
846  &ierr);
847 
848  fld=(double)flow;
849 
850  }
851 
852  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
853  (float)(fld-minv);
854 
855  yvalue=fyvalue;
856 
857  XSetForeground(display,gc1,mmap[4]);
858 
859  if(yvalue > ys+yparm1 &&
860  yvalue < height-yparm2)
861  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
862  width-xparm1,yvalue);
863 
864 
865  }
866 
867 if(save_rec[k].rate_table.AryMax >= 0){
868 
869  if(ilinear==0)
870  fld=save_rec[k].rate_table.HMax;
871 
872  else {
873 
874  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
875  values[0].zdate,
876  (double)save_rec[k].rate_table.HMax,
877  &ierr);
878 
879  fld=(double)flow;
880 
881  }
882 
883  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
884  (float)(fld-minv);
885 
886  yvalue=fyvalue;
887 
888  XSetForeground(display,gc1,mmap[8]);
889 
890  if(yvalue > ys+yparm1 &&
891  yvalue < height-yparm2)
892  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
893  width-xparm1,yvalue);
894 
895 
896  }
897 
898 line_width=1;
899 line_style=LineSolid;
900 cap_style=CapRound;
901 join_style=JoinRound;
902 
903 XSetLineAttributes(display,gc1,line_width,line_style,
904  cap_style,join_style);
905 
906 XSetForeground(display,gc1,mmap[3]);
907 
908 if(save_rec[k].rate_table.AryMax >= 0) {
909 
910  xvalue=xs+10;
911 
912 
913  get_units("Q",ubuf);
914 
915  len=strlen(ubuf);
916 
917  ybegin=ymin+((ymax-ymin) - len*yheight)/2;
918 
919  if(ybegin < ymin)
920  ybegin=ymin;
921 
922  for(i=0;i<len;i++) {
923 
924  xbuf[0]=ubuf[i];
925  xbuf[1]=0;
926 
927  yvalue=ybegin+i*yheight;
928  XDrawString(display,bwindow[m],gc1,xvalue,
929  yvalue,xbuf,strlen(xbuf));
930 
931 
932  }
933 
934 }
935 
936 
937 xvalue=width-20;
938 
939 if(save_rec[k].parm[0]=='Q' && save_rec[k].parm[2] !='M')
940  get_units("H",ubuf);
941 
942 else
943  get_units(save_rec[k].parm,ubuf);
944 
945 len=strlen(ubuf);
946 
947 ybegin=ymin+((ymax-ymin) - len*yheight)/2;
948 
949 if(ybegin < ymin)
950  ybegin=ymin;
951 
952 for(i=0;i<len;i++) {
953 
954  xbuf[0]=ubuf[i];
955  xbuf[1]=0;
956 
957  yvalue=ybegin+i*yheight;
958  XDrawString(display,bwindow[m],gc1,xvalue,
959  yvalue,xbuf,strlen(xbuf));
960 
961 
962  }
963 
964 XSetForeground(display,gc1,mmap[7]);
965 
966 if(save_rec[k].volume!= 0) {
967 
968  for(i=0;i<inum;i++) {
969 
970  tm.tm_year=values[i].zdate/10000-1900;
971  tm.tm_mon=(values[i].zdate-(tm.tm_year+1900)*10000)/100;
972  tm.tm_mday=values[i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
973  tm.tm_hour=values[i].ztime/10000;
974  tm.tm_min=(values[i].ztime-tm.tm_hour*10000)/100;
975 
976  tm.tm_mon=tm.tm_mon;
977  stim=ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,
978  tm.tm_hour,tm.tm_min,0);
979 
980  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
981  (float)(letim-stim);
982 
983  svalue=values[i].value;
984 
985  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
986  (float)(svalue-minv);
987 
988  yvalue=fyvalue+.5;
989  xvalue=fxvalue+.5;
990 
991  dxvalue=-(float)(xmax-xmin)/(float)(letim-lbtim)*
992  (float)(3600*save_rec[k].volume);
993 
994  dvalue=dxvalue+.5;
995 
996  if(dvalue < 2)
997  dvalue=2;
998 
999  if(ymax - yvalue == 0 && i > 0) {
1000 
1001  if(oqual != 'S' && oqual != 'V')
1002  XSetForeground(display,gc1,mmap[9]);
1003 
1004  else
1005  XSetForeground(display,gc1,mmap[7]);
1006 
1007  XDrawLine(display,bwindow[m],gc1,xvalue-dvalue,ymax,
1008  xvalue,ymax);
1009 
1010  }
1011 
1012  else {
1013 
1014  if(ymax-yvalue==0)
1015  XSetForeground(display,gc1,mmap[3]);
1016 
1017  else
1018  XSetForeground(display,gc1,mmap[7]);
1019 
1020  XFillRectangle(display,bwindow[m],gc1,
1021  xvalue-dvalue,yvalue,
1022  dvalue-1,ymax-yvalue+1);
1023 
1024 
1025  }
1026  xvalue1=xvalue;
1027  yvalue1=yvalue;
1028  otim=stim;
1029  oqual=values[i].qual;
1030 
1031  }
1032 
1033  }
1034 
1035 else {
1036 
1037 for(i=0;i<inum;i++) {
1038 
1039  tm.tm_year=values[i].zdate/10000-1900;
1040  tm.tm_mon=(values[i].zdate-(tm.tm_year+1900)*10000)/100;
1041  tm.tm_mday=values[i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1042  tm.tm_hour=values[i].ztime/10000;
1043  tm.tm_min=(values[i].ztime-tm.tm_hour*10000)/100;
1044 
1045  tm.tm_mon=tm.tm_mon;
1046  stim=ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
1047 
1048  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
1049  (float)(letim-stim);
1050 
1051  svalue=values[i].value;
1052 
1053  if(ilinear==1 &&
1054  save_rec[k].rate_table.AryMax >= 0) {
1055  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1056  values[i].zdate,
1057  (double)svalue,
1058  &ierr);
1059 
1060  svalue=(double)flow;
1061 
1062  }
1063 
1064  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
1065  (float)(svalue-minv);
1066 
1067  yvalue=fyvalue;
1068  xvalue=fxvalue;
1069 
1070  if(oqual != 'S' && oqual != 'V')
1071  XSetForeground(display,gc1,mmap[9]);
1072 
1073  else
1074  XSetForeground(display,gc1,mmap[7]);
1075 
1076  if(i > 0) {
1077 
1078  if(otim-stim < 7200L)
1079  XDrawLine(display,bwindow[m],gc1,xvalue,yvalue,
1080  xvalue1,yvalue1);
1081 
1082  else {
1083 
1084  XDrawArc(display,bwindow[m],gc1,xvalue1-2,yvalue1-2,
1085  4,4,0,360*64);
1086  XDrawArc(display,bwindow[m],gc1,xvalue-2,yvalue-2,
1087  4,4,0,360*64);
1088  }
1089 
1090  }
1091 
1092  xvalue1=xvalue;
1093  yvalue1=yvalue;
1094  otim=stim;
1095  oqual=values[i].qual;
1096 
1097  }
1098 
1099 }
1100 
1101 XSetForeground(display,gc1,mmap[3]);
1102 if(save_rec[k].rate_table.AryMax >= 0)
1103  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1104  values[0].zdate,
1105  (double)max_min.max,
1106  &ierr);
1107 
1108 sprintf(buf,"Max=%6.1f",max_min.max);
1109 
1110 if(save_rec[k].rate_table.AryMax >= 0) {
1111 
1112  sprintf(abuf," %d",flow);
1113  strcat(buf,abuf);
1114 
1115  }
1116 
1117 sprintf(abuf," at %02d/%02d/%02d %02dZ",
1118  max_min.tmx.tm_mon,max_min.tmx.tm_mday,max_min.tmx.tm_year,
1119  max_min.tmx.tm_hour);
1120 
1121 strcat(buf,abuf);
1122 
1123 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*2,
1124  buf,strlen(buf));
1125 
1126 if(save_rec[k].rate_table.AryMax >= 0)
1127  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1128  values[0].zdate,
1129  (double)max_min.min,
1130  &ierr);
1131 
1132 sprintf(buf,"Min=%6.1f",max_min.min);
1133 
1134 if(save_rec[k].rate_table.AryMax >= 0) {
1135 
1136  sprintf(abuf," %d",flow);
1137  strcat(buf,abuf);
1138 
1139  }
1140 
1141 sprintf(abuf," at %02d/%02d/%02d %02dZ",
1142  max_min.tmn.tm_mon,max_min.tmn.tm_mday,max_min.tmn.tm_year,
1143  max_min.tmn.tm_hour);
1144 
1145 strcat(buf,abuf);
1146 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*1,
1147  buf,strlen(buf));
1148 
1149 save_rec[k].is_realized=1;
1150 
1151 }
1152 
1153 struct max_min get_max_min(struct stn_values *stn_values,int inum)
1154 
1155 {
1156 
1157 struct max_min max_min;
1158 int i,xdate,xtime,ndate,ntime;
1159 double abs1,abs2;
1160 
1161 max_min.max=-999999;
1162 max_min.min= 999999;
1163 
1164 for(i=0;i<inum;i++) {
1165 
1166  if(stn_values[i].value > max_min.max) {
1167 
1169  xdate=stn_values[i].zdate;
1170  xtime=stn_values[i].ztime;
1171 
1172  }
1173 
1174  if(stn_values[i].value < max_min.min) {
1175 
1177  ndate=stn_values[i].zdate;
1178  ntime=stn_values[i].ztime;
1179 
1180  }
1181 
1182 
1183  }
1184 
1185 max_min.tmx.tm_year=xdate/10000-1900;
1186 max_min.tmx.tm_mon=(xdate-(max_min.tmx.tm_year+1900)*10000)/100;
1187 max_min.tmx.tm_mday=xdate-(max_min.tmx.tm_year+1900)*10000-max_min.tmx.tm_mon*100;
1188 max_min.tmx.tm_hour=xtime/10000;
1189 max_min.tmx.tm_min=(xtime-max_min.tmx.tm_hour*10000)/100;
1190 max_min.tmx.tm_mon=max_min.tmx.tm_mon;
1191 
1192 max_min.tmn.tm_year=ndate/10000-1900;
1193 max_min.tmn.tm_mon=(ndate-(max_min.tmn.tm_year+1900)*10000)/100;
1194 max_min.tmn.tm_mday=ndate-(max_min.tmn.tm_year+1900)*10000-max_min.tmn.tm_mon*100;
1195 max_min.tmn.tm_hour=ntime/10000;
1196 max_min.tmn.tm_min=(ntime-max_min.tmn.tm_hour*10000)/100;
1197 max_min.tmn.tm_mon=max_min.tmn.tm_mon;
1198 
1199 return(max_min);
1200 
1201 }
1202 
1203 int get_delta_time(time_t lbtim,time_t letim)
1204 
1205 {
1206 
1207 int hours,dhours;
1208 
1209 hours=(lbtim-letim)/3600L;
1210 
1211 if(hours < 24)
1212  dhours=1;
1213 
1214 else if(hours < 96)
1215  dhours=3;
1216 
1217 else if(hours < 144)
1218  dhours=6;
1219 
1220 else if(hours < 288)
1221  dhours=24;
1222 
1223 else if(hours < 576)
1224  dhours=48;
1225 
1226 else if(hours < 1152)
1227  dhours=72;
1228 
1229 else if(hours < 2304)
1230  dhours=96;
1231 
1232 else if(hours < 4608)
1233  dhours=192;
1234 
1235 else
1236  dhours=30*24;
1237 
1238 return(dhours);
1239 
1240 }
1241 
1242 float get_delta_valu(int diff)
1243 
1244 {
1245 
1246 float dval;
1247 
1248 if(diff <= 1)
1249  dval=.1;
1250 
1251 else if(diff < 4)
1252  dval=.2;
1253 
1254 else if(diff < 10)
1255  dval=.5;
1256 
1257 else if(diff < 20)
1258  dval=1;
1259 
1260 else if(diff < 40)
1261  dval=2;
1262 
1263 else if(diff < 100)
1264  dval=5;
1265 
1266 else if(diff < 200)
1267  dval=10;
1268 
1269 else if(diff < 400)
1270  dval=20;
1271 
1272 else if(diff < 1000)
1273  dval=50;
1274 
1275 else if(diff < 2000)
1276  dval=100;
1277 
1278 else if(diff < 4000)
1279  dval=200;
1280 
1281 else if(diff < 10000)
1282  dval=500;
1283 
1284 else if(diff < 20000)
1285  dval=1000;
1286 
1287 else if(diff < 40000)
1288  dval=2000;
1289 
1290 else if(diff < 100000)
1291  dval=5000;
1292 
1293 else if(diff < 200000)
1294  dval=10000;
1295 
1296 else if(diff < 400000)
1297  dval=20000;
1298 
1299 else if(diff < 1000000)
1300  dval=50000;
1301 
1302 else if(diff < 2000000)
1303  dval=100000;
1304 
1305 else if(diff < 4000000)
1306  dval=200000;
1307 
1308 else
1309  dval=1000000;
1310 
1311 return(dval);
1312 
1313 }
1314 
1315 
1316 void options_draw(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1317 
1318 {
1319 
1320 int k,j;
1321 Dimension width,height;
1322 Arg args[10];
1323 
1324 j=(int)data/100;
1325 
1326 k=(int)data-j*100;
1327 
1328 if(k==0)
1329  linear=0;
1330 
1331 if(k==1)
1332  linear=1;
1333 
1334 if(k==2)
1335  scale=0;
1336 
1337 if(k==3)
1338  scale=1;
1339 
1340 XtSetArg(args[0],XtNwidth,&width);
1341 XtSetArg(args[1],XtNheight,&height);
1342 XtGetValues(bdrawing_area[j],args,2);
1343 
1344 XSetFunction(display,gc1,GXcopy);
1345 XSetForeground(display,gc1,mmap[0]);
1346 XSetBackground(display,gc1,mmap[0]);
1347 XFillRectangle(display,bwindow[j],gc1,0,0,width,height);
1348 
1349 draw_area(j,j,0,0,width,height);
1350 
1351 }
1352 
1353 void quit_draw(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1354 
1355 {
1356 
1357 int k;
1358 
1359 k=(int)data;
1360 
1361 
1362 XtDestroyWidget(bdrawing_area[k]);
1363 XtDestroyWidget(draw_dialog[k]);
1364 
1365 draw_dialog[k]=0;
1366 save_rec[k].inum=-1;
1367 
1368 }
1369 
1370 void bhandle_expose(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1371 
1372 {
1373 
1374 int k;
1375 Dimension width,height;
1376 Arg args[10];
1377 
1378 k=(int)data;
1379 
1380 XtSetArg(args[0],XtNwidth,&width);
1381 XtSetArg(args[1],XtNheight,&height);
1382 XtGetValues(bdrawing_area[k],args,2);
1383 
1384 XSetFunction(display,gc1,GXcopy);
1385 XSetForeground(display,gc1,mmap[0]);
1386 XSetBackground(display,gc1,mmap[0]);
1387 XFillRectangle(display,bwindow[k],gc1,0,0,
1389 
1390 if(save_rec[k].is_realized==1)
1391  draw_area(k,k,0,0,width,height);
1392 
1393 XmUpdateDisplay(bdrawing_area[k]);
1394 
1395 }
1396 
1397 int get_dbase(char *pc,int *num)
1398 
1399 {
1400 
1401 int j;
1402 
1403 j=0;
1404 
1405 
1406 if(pc[2]=='M')
1407  num[j++]=4;
1408 
1409 else if(strcasecmp(pc,"PCIRGZZ")==0)
1410  num[j++]=0;
1411 
1412 else if(strcasecmp(pc,"PPH1GZZ")==0)
1413  num[j++]=1;
1414 
1415 else if(strcasecmp(pc,"PPH2GZZ")==0)
1416  num[j++]=1;
1417 
1418 else if(strcasecmp(pc,"PPQ1GZZ")==0)
1419  num[j++]=2;
1420 
1421 else if(strcasecmp(pc,"PPQ2GZZ")==0)
1422  num[j++]=2;
1423 
1424 else if(strcasecmp(pc,"PPD1GZZ")==0)
1425  num[j++]=3;
1426 
1427 else if(strcasecmp(pc,"PPD2GZZ")==0)
1428  num[j++]=3;
1429 
1430 else if(strcasecmp(pc,"PPMRGZZ")==0)
1431  num[j++]=4;
1432 
1433 else if(strcasecmp(pc,"PCIRPZZ")==0)
1434  num[j++]=0;
1435 
1436 else if(strcasecmp(pc,"PPH1PZZ")==0)
1437  num[j++]=1;
1438 
1439 else if(strcasecmp(pc,"PPH2PZZ")==0)
1440  num[j++]=1;
1441 
1442 else if(strcasecmp(pc,"PPQ1PZZ")==0)
1443  num[j++]=2;
1444 
1445 else if(strcasecmp(pc,"PPQ2PZZ")==0)
1446  num[j++]=2;
1447 
1448 else if(strcasecmp(pc,"PPD1PZZ")==0)
1449  num[j++]=3;
1450 
1451 else if(strcasecmp(pc,"PPD2PZZ")==0)
1452  num[j++]=3;
1453 
1454 else if(strcasecmp(pc,"PPMRPZZ")==0)
1455  num[j++]=4;
1456 
1457 else if(strcasecmp(pc,"PCIRMZZ")==0)
1458  num[j++]=0;
1459 
1460 else if(strcasecmp(pc,"PPH1MZZ")==0)
1461  num[j++]=1;
1462 
1463 else if(strcasecmp(pc,"PPH2MZZ")==0)
1464  num[j++]=1;
1465 
1466 else if(strcasecmp(pc,"PPQ1MZZ")==0)
1467  num[j++]=2;
1468 
1469 else if(strcasecmp(pc,"PPQ2MZZ")==0)
1470  num[j++]=2;
1471 
1472 else if(strcasecmp(pc,"PPD1MZZ")==0)
1473  num[j++]=3;
1474 
1475 else if(strcasecmp(pc,"PPD2MZZ")==0)
1476  num[j++]=3;
1477 
1478 else if(strcasecmp(pc,"PPMRMZZ")==0)
1479  num[j++]=4;
1480 
1481 else if(strcasecmp(pc,"PPHRZZZ")==0)
1482  num[j++]=0;
1483 
1484 else if(strcasecmp(pc,"PPH1ZZZ")==0)
1485  num[j++]=1;
1486 
1487 else if(strcasecmp(pc,"PPH2ZZZ")==0)
1488  num[j++]=1;
1489 
1490 else if(strcasecmp(pc,"PPQRZZZ")==0)
1491  num[j++]=0;
1492 
1493 else if(strcasecmp(pc,"PPQ1ZZZ")==0)
1494  num[j++]=2;
1495 
1496 else if(strcasecmp(pc,"PPQ2ZZZ")==0)
1497  num[j++]=2;
1498 
1499 else if(strcasecmp(pc,"PPDRZZZ")==0)
1500  num[j++]=0;
1501 
1502 else if(strcasecmp(pc,"PPD1ZZZ")==0)
1503  num[j++]=3;
1504 
1505 else if(strcasecmp(pc,"PPD2ZZZ")==0)
1506  num[j++]=3;
1507 
1508 else if(strcasecmp(pc,"PPMRZZZ")==0)
1509  num[j++]=4;
1510 
1511 else if(strcasecmp(pc,"HGIRGZZ")==0)
1512  num[j++]=0;
1513 
1514 else if(strcasecmp(pc,"HGIRPZZ")==0)
1515  num[j++]=0;
1516 
1517 else if(strcasecmp(pc,"HGIRZZZ")==0) {
1518 
1519  num[j++]=0;
1520  num[j++]=3;
1521 
1522  }
1523 
1524 else if(strcasecmp(pc,"HPIRGZZ")==0)
1525  num[j++]=0;
1526 
1527 else if(strcasecmp(pc,"HPIRZZZ")==0) {
1528 
1529  num[j++]=0;
1530  num[j++]=3;
1531 
1532  }
1533 
1534 else if(strcasecmp(pc,"LSIRGZZ")==0)
1535  num[j++]=1;
1536 
1537 else if(strcasecmp(pc,"QRIRGZZ")==0)
1538  num[j++]=1;
1539 
1540 else if(strcasecmp(pc,"QRIRPZZ")==0)
1541  num[j++]=1;
1542 
1543 else if(strcasecmp(pc,"QRIRZZZ")==0)
1544  num[j++]=1;
1545 
1546 else if(strcasecmp(pc,"TAIRGZZ")==0)
1547  num[j++]=0;
1548 
1549 else if(strcasecmp(pc,"SWIRMZZ")==0)
1550  num[j++]=0;
1551 
1552 else if(strcasecmp(pc,"TAIRMXZ")==0) {
1553  num[j++]=0;
1554  num[j++]=3;
1555 
1556  }
1557 
1558 else if(strcasecmp(pc,"TAIRMNZ")==0) {
1559 
1560  num[j++]=0;
1561  num[j++]=3;
1562 
1563  }
1564 
1565 else if(strcasecmp(pc,"TAIRGXZ")==0)
1566  num[j++]=3;
1567 
1568 else if(strcasecmp(pc,"TAIRGNZ")==0)
1569  num[j++]=3;
1570 
1571 else if(strcasecmp(pc,"TAIRZNZ")==0) {
1572 
1573  num[j++]=0;
1574  num[j++]=3;
1575 
1576  }
1577 
1578 else if(strcasecmp(pc,"TAIRZXZ")==0) {
1579 
1580  num[j++]=0;
1581  num[j++]=3;
1582 
1583  }
1584 
1585 else if(strcasecmp(pc,"UDIRGZZ")==0)
1586  num[j++]=0;
1587 
1588 else if(strcasecmp(pc,"USIRGZZ")==0)
1589  num[j++]=0;
1590 
1591 else if(strcasecmp(pc,"UQIRGZZ")==0)
1592  num[j++]=0;
1593 
1594 else if(strcasecmp(pc,"UDIRZZZ")==0)
1595  num[j++]=0;
1596 
1597 else if(strcasecmp(pc,"USIRZZZ")==0)
1598  num[j++]=0;
1599 
1600 else if(strcasecmp(pc,"XRIRGZZ")==0)
1601  num[j++]=0;
1602 
1603 else
1604  num[j++]=6;
1605 
1606 
1607 return(j);
1608 
1609 }
1610 
1611 void get_units(char *ibuf,char *sbuf)
1612 
1613 {
1614 
1615  if(strncasecmp("P",ibuf,1)==0)
1616  strcpy(sbuf,"INCHES");
1617 
1618  else if(strncasecmp("T",ibuf,1)==0)
1619  strcpy(sbuf,"DEGREES F");
1620 
1621  else if(strncasecmp("X",ibuf,1)==0)
1622  strcpy(sbuf,"PERCENT");
1623 
1624  else if(strncasecmp("H",ibuf,1)==0)
1625  strcpy(sbuf,"FEET");
1626 
1627  else if(strncasecmp("L",ibuf,1)==0)
1628  strcpy(sbuf,"AC-FT");
1629 
1630  else if(strncasecmp("Q",ibuf,1)==0 && strlen(ibuf) > 3 &&
1631  strncasecmp("M",&ibuf[2],1)==0)
1632  strcpy(sbuf,"AC-FT");
1633 
1634  else if(strncasecmp("Q",ibuf,1)==0 && strlen(ibuf) > 5 &&
1635  strncasecmp("Z",&ibuf[4],1)==0)
1636  strcpy(sbuf,"KCFS");
1637 
1638  else if(strncasecmp("Q",ibuf,1)==0)
1639  strcpy(sbuf,"CFS");
1640 
1641  else if(strncasecmp("US",ibuf,2)==0)
1642  strcpy(sbuf,"MILES PER HOUR");
1643 
1644  else if(strncasecmp("UD",ibuf,2)==0)
1645  strcpy(sbuf,"DEGREES");
1646 
1647 
1648  else
1649  strcpy(sbuf,"VALUE");
1650 
1651 }
1652 
1653 void get_acronym(char *ibuf,char *sbuf)
1654 
1655 {
1656 
1657  sbuf[0]=0;
1658  if(strncasecmp("HG",ibuf,2)==0)
1659  strcat(sbuf,"RIVER STAGE");
1660 
1661  else if(strncasecmp("HP",ibuf,2)==0)
1662  strcat(sbuf,"RESERVOIR POOL ELEVATION");
1663 
1664  else if(strncasecmp("LS",ibuf,2)==0)
1665  strcat(sbuf,"LAKE STORAGE");
1666 
1667  else if(strncasecmp("PC",ibuf,2)==0)
1668  strcat(sbuf,"PRECIPITATION ACCUMULATION");
1669 
1670  else if(strncasecmp("PP",ibuf,2)==0)
1671  strcat(sbuf,"PRECIPITATION INCREMENTAL");
1672 
1673  else if(strncasecmp("QC",ibuf,2)==0)
1674  strcat(sbuf,"RUNOFF VOLUME");
1675 
1676  else if(strncasecmp("QD",ibuf,2)==0)
1677  strcat(sbuf,"DISCHARGE-DIVERSION");
1678 
1679  else if(strncasecmp("QI",ibuf,2)==0)
1680  strcat(sbuf,"DISCHARGE-INFLOW");
1681 
1682  else if(strncasecmp("QR",ibuf,2)==0)
1683  strcat(sbuf,"DISCHARGE-RIVER");
1684 
1685  else if(strncasecmp("QT",ibuf,2)==0)
1686  strcat(sbuf,"DISCHARGE-OUTFLOW");
1687 
1688  else if(strncasecmp("SD",ibuf,2)==0)
1689  strcat(sbuf,"SNOW DEPTH");
1690 
1691  else if(strncasecmp("SW",ibuf,2)==0)
1692  strcat(sbuf,"SNOW WATER EQUIVALENT");
1693 
1694  else if(strncasecmp("TA",ibuf,2)==0)
1695  strcat(sbuf,"AIR TEMPERATURE");
1696 
1697  else if(strncasecmp("US",ibuf,2)==0)
1698  strcat(sbuf,"WIND SPEED");
1699 
1700  else if(strncasecmp("UD",ibuf,2)==0)
1701  strcat(sbuf,"WIND DIRECTION");
1702 
1703  else if(strncasecmp("UQ",ibuf,2)==0)
1704  strcat(sbuf,"WIND SPEED/DIRECTION");
1705 
1706  else if(strncasecmp("XR",ibuf,2)==0)
1707  strcat(sbuf,"RELATIVE HUMIDITY");
1708 
1709  else
1710  strcat(sbuf,"UNKNOWN");
1711 
1712  strcat(sbuf,",");
1713 
1714  if(strncasecmp("I",&ibuf[2],1)==0)
1715  strcat(sbuf,"INSTANTANEOUS");
1716 
1717  else if(strncasecmp("D",&ibuf[2],1)==0)
1718  strcat(sbuf,"DAILY");
1719 
1720  else if(strncasecmp("Q",&ibuf[2],1)==0)
1721  strcat(sbuf,"SIX HOURLY");
1722 
1723  else if(strncasecmp("M",&ibuf[2],1)==0)
1724  strcat(sbuf,"MONTHLY");
1725 
1726  else
1727  strcat(sbuf,"UNKNOWN");
1728 
1729  strcat(sbuf,",");
1730 
1731  if(strncasecmp("R",&ibuf[3],1)==0)
1732  strcat(sbuf,"OBSERVED");
1733 
1734  else if(strncasecmp("P",&ibuf[3],1)==0)
1735  strcat(sbuf,"PROCESSED");
1736 
1737  else if(strncasecmp("1",&ibuf[3],1)==0)
1738  strcat(sbuf,"PROCESSED LEVEL 1");
1739 
1740  else if(strncasecmp("2",&ibuf[3],1)==0)
1741  strcat(sbuf,"PROCESSED LEVEL 2");
1742 
1743  else if(strncasecmp("F",&ibuf[3],1)==0)
1744  strcat(sbuf,"FORECAST");
1745 
1746  else
1747  strcat(sbuf,"UNKNOWN");
1748 
1749  strcat(sbuf,",");
1750 
1751  if(strncasecmp("Z",&ibuf[4],1)==0)
1752  strcat(sbuf,"STP/SAO");
1753 
1754  else if(strncasecmp("G",&ibuf[4],1)==0)
1755  strcat(sbuf,"GOES");
1756 
1757  else if(strncasecmp("M",&ibuf[4],1)==0)
1758  strcat(sbuf,"METEOR");
1759 
1760  else if(strncasecmp("P",&ibuf[4],1)==0)
1761  strcat(sbuf,"PHONE");
1762 
1763  else if(strncasecmp("R",&ibuf[4],1)==0)
1764  strcat(sbuf,"RADIO");
1765 
1766  else
1767  strcat(sbuf,"UNKNOWN");
1768 
1769  if(strncasecmp("Z",&ibuf[5],1)!=0)
1770  strcat(sbuf,",");
1771 
1772  if(strncasecmp("X",&ibuf[5],1)==0)
1773  strcat(sbuf,"MAXIMUM:DAILY");
1774 
1775  else if(strncasecmp("N",&ibuf[5],1)==0)
1776  strcat(sbuf,"MINIMUM:DAILY");
1777 
1778  if(strncasecmp("Z",&ibuf[6],1)!=0)
1779  strcat(sbuf,", ");
1780 
1781  if(strncasecmp("F",&ibuf[6],1)==0)
1782  strcat(sbuf,".05");
1783 
1784  else if(strncasecmp("N",&ibuf[6],1)==0)
1785  strcat(sbuf,".95");
1786 
1787  return;
1788 
1789 }
1790 
1791 void to_stage(char *hb5,char pe1,char pe2,struct stn_values *stn_values,int inum)
1792 
1793 {
1794 
1795 int i;
1796 int ierr;
1797 int qflow;
1798 double qstage;
1799 
1800 for(i=0;i<inum;i++) {
1801 
1802  qflow=stn_values[i].value*1000;
1803  qstage=GetStage(hb5,pe1,pe2,stn_values[i].zdate,
1804  qflow,&ierr);
1805 
1806  stn_values[i].value=qstage;
1807 
1808  }
1809 
1810 return;
1811 
1812 }
1813 /*
1814 Widget BuildPulldownToggleMenu(Widget parent,char *menu_title,char menu_mnemonic,struct MenuItem *items)
1815 
1816 
1817 {
1818 
1819  Widget Pulldown, button;
1820  int i;
1821  int argcount;
1822  Arg args[10];
1823 
1824  argcount=0;
1825 
1826  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
1827  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
1828  Pulldown=XmCreatePulldownMenu(parent,"pulldown",args,argcount);
1829  XtSetArg(args[argcount],XmNselectColor,mmap[4]);argcount++;
1830 
1831  for(i=0;items[i].label!=NULL;i++) {
1832 
1833  button=XmCreateToggleButton(Pulldown,items[i].label,args,argcount);
1834  XtAddCallback(button,XmNvalueChangedCallback,items[i].callback,items[i].callback_data);
1835 
1836  XtManageChild(button);
1837 
1838  }
1839 
1840  return(Pulldown);
1841 
1842 }
1843 
1844 Widget BuildPulldownPushMenu(Widget parent,char *menu_title,char menu_mnemonic,struct MenuItem *items)
1845 
1846 
1847 {
1848 
1849  Widget Pulldown, button;
1850  int i;
1851  int argcount;
1852  Arg args[10];
1853 
1854  argcount=0;
1855 
1856  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
1857  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
1858  Pulldown=XmCreatePulldownMenu(parent,"pulldown",args,argcount);
1859 
1860  for(i=0;items[i].label!=NULL;i++) {
1861 
1862  button=XmCreatePushButton(Pulldown,items[i].label,args,argcount);
1863  XtAddCallback(button,XmNactivateCallback,items[i].callback,
1864  items[i].callback_data);
1865  XtManageChild(button);
1866 
1867  }
1868 
1869 return(Pulldown);
1870 
1871 }
1872 
1873 Widget AttachToCascade(Widget parent, char *label,Widget sub_menu)
1874 
1875 {
1876 Arg args[10];
1877 Cardinal argcount;
1878 Widget cbutton;
1879 
1880 argcount=0;
1881 XtSetArg(args[argcount],XmNsubMenuId,sub_menu);argcount++;
1882 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
1883 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
1884 cbutton=XmCreateCascadeButton(parent,label,args,argcount);
1885 XtManageChild(cbutton);
1886 return(cbutton);
1887 
1888 }
1889 
1890 */
char sbuf[10]
Definition: build_list.c:123
char pe1
Definition: build_list.c:122
struct dval dval
Definition: daily_qc.c:292
void berror(Widget widget, char *string)
Definition: daily_qc.c:6411
Widget BuildPulldownPushMenu(Widget parent, char *menu_title, char menu_mnemonic, struct MenuItem *items)
Definition: daily_qc.c:1115
time_t tim
Definition: daily_qc.c:154
Widget menu_bar
Definition: daily_qc.c:214
int qflag[10]
Definition: daily_qc.c:293
Widget AttachToCascade(Widget parent, char *label, Widget sub_menu)
Definition: daily_qc.c:1225
void bhandle_expose()
int get_delta_time(time_t lbtim, time_t letim)
int hour
Definition: display_data.c:30
Widget bmain_window
Definition: daily_qc.c:115
XFontStruct * info_font[10]
Definition: daily_qc.c:230
void display_data(char *hb5, char *pc, int dmonth, int dday, int dyear, int dhour, int ddays)
Definition: display_data.c:32
void to_stage(char *hb5, char pe1, char pe2, struct stn_values *stn_values, int inum)
char qual[10]
Definition: display_data.c:29
unsigned long mmap[16]
Definition: daily_qc.c:226
struct max_min get_max_min(struct stn_values *stn_values, int inum)
int display_method
Definition: daily_qc.c:112
GC gc1
Definition: display_data.c:17
Widget top_level
Definition: daily_qc.c:214
char pe2
Definition: display_data.c:26
struct stn_values * stn_values
Definition: display_data.c:3
static int scale
Definition: display_data.c:19
Widget draw_dialog[10]
Definition: daily_qc.c:114
int day
Definition: display_data.c:30
struct stim btim
Definition: display_data.c:20
static int bmax_width
Definition: display_data.c:19
int days
Definition: display_data.c:30
void get_new_values()
static int linear
Definition: display_data.c:19
void draw_area(int k, int m, int xs, int ys, int xz, int yz)
Definition: display_data.c:306
static int bmax_height
Definition: display_data.c:19
Widget bdrawing_area[10]
Definition: daily_qc.c:113
Window bwindow[20]
Definition: daily_qc.c:110
void get_units(char *ibuf, char *sbuf)
Display * display
Definition: daily_qc.c:228
Font font[10]
Definition: daily_qc.c:231
int init_subdisplay
Definition: daily_qc.c:109
struct stim etim
Definition: display_data.c:21
int year
Definition: display_data.c:30
Window root_win
Definition: display_data.c:8
void get_acronym(char *ibuf, char *sbuf)
static int depth
Definition: display_data.c:19
int dbase
Definition: display_data.c:28
void quit_draw()
int month
Definition: display_data.c:30
float get_delta_valu(int diff)
int get_dbase(char *pc, int *num)
void options_draw()
long ouptime(int, int, int, int, int, int)
double GetStage(char *ihb5, char pe1, char pe2, int zdate, int Flow, int *Warning)
Definition: rat.c:1941
static RatingTable rate_table
Definition: rat.c:138
int GetFlow(char *ihb5, char pe1, char pe2, int zdate, double Stage, int *Warning)
Definition: rat.c:1693
Definition: misc.h:386
char * label
Definition: misc.h:388
void(* callback)()
Definition: misc.h:390
XtPointer callback_data
Definition: misc.h:391
double HMax
Definition: rate_table.h:16
double wrn
Definition: rate_table.h:20
double RatStg[200]
Definition: rate_table.h:12
double fld
Definition: rate_table.h:21
Definition: misc.h:397
Definition: misc.h:23
struct tm tmx
Definition: misc.h:27
float min
Definition: misc.h:26
float max
Definition: misc.h:25
struct tm tmn
Definition: misc.h:28
Definition: misc.h:151
struct stim btim
Definition: misc.h:157
RatingTable rate_table
Definition: misc.h:155
struct stim etim
Definition: misc.h:158
char parm[10]
Definition: misc.h:154
int volume
Definition: misc.h:160
int is_realized
Definition: misc.h:161
int inum
Definition: misc.h:159
Definition: misc.h:55
int day
Definition: misc.h:59
int year
Definition: misc.h:57
int hour
Definition: misc.h:60
int month
Definition: misc.h:58
Definition: misc.h:98
char id[6]
Definition: misc.h:100
char des[51]
Definition: misc.h:104
char qual
Definition: misc.h:93
int zdate
Definition: misc.h:90
int ztime
Definition: misc.h:91
float value
Definition: misc.h:92