This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
Chris, I think I fixed this here in a september patch. Once we get things shipped out to the ams- I'll consolidate all these patches again into a completely new distribution since traking all these patches is a royal pain. I've attatched the nwx files dir.c and txtw.c to this message. Place these routines in your $NAWIPS/nprogs/nwx/source directory, then build with: cd $NAWIPS/nprogs/nwx/source make all make install make clean Let me know if this clears things up. Steve Chiswell Unidata User Support On Wed, 5 Jan 2000, Unidata Support wrote: > > ------- Forwarded Message > > >To: Steve Chiswell <address@hidden> > >From: "C. Vandersip" <address@hidden> > >Subject: NWX Troubles > >Organization: . > >Keywords: 200001051908.MAA15700 > > Steve, > > Have been unable to get new NWX to work properly. Typical message is "No > data available" for all products. I've read the archives and think I > understand how nwx finds the sao sources. Here's how our pqact.conf is > setup: > > WMO ^S[AP].* .... ([0-3][0-9])([0-2][0-9]) > STDIOFILE data/surface/sao/(\1:yyyy)(\1:mm)\1\2_sao.wmo > > which produces files in this format: > > 2000010517_sao.wmo > > > The relevant Gemenviron variables are: > > setenv LDMDATA /export/data/ > setenv RAW_SAO $LDMDATA/surface/sao > > > System is Solaris 2.5, nawips5.4pl14. > > > Seems all is setup OK and I don't see a file similar to the one for > nsharp, so I'm befuddled. > > Thanks, > > Chris > > ############################################################### > # Chris Vandersip # > # Computer Research Specialist/Dept. Sysadmin # > # Rm. 024, Dept. of Meteorology, Florida State University # > # address@hidden (850)644-2522 # > ############################################################### > > > ------- End of Forwarded Message > >
#include "gui.h" #include "geminc.h" #ifdef UNDERSCORE #define cfdate cfdate_ #endif /* UNDERSCORE */ /* * Micro to set the date/time based on the input and * current date/time. */ #define SET_DTTM(dttm, curdttm) {\ if ( dttm.year == 0 ) \ dttm.year = curdttm.year; \ if ( dttm.month == 0 ) \ dttm.month = curdttm.month; \ if ( dttm.day == 0 ) \ dttm.day = curdttm.day; \ if ( dttm.hour > 24 ) \ dttm.hour = curdttm.hour; \ } void dir_getflist(); void dir_getnextf(); int _select_dir (); char _sdttm[9], _edttm[9]; /* date/time constraints */ char _exten[9]; /* file extension */ int _extlen, _dttmlen; /************************************************************************ * dir.c * * * * This module scans the directory for desired data files. * * * * CONTENTS: * * dir_getflist() get the desired file lists in the directory. * * dir_getnextf() get the latest file in the file list. * * _select_dir() internal function used in dir_getfiles to * * select files with matched extention and time * * constraints. * ***********************************************************************/ /*=====================================================================*/ void dir_getflist ( dtyp_info, idtyp, startdttm, enddttm, dir_info, iret ) struct datatype_list *dtyp_info; int idtyp; struct date_time_info startdttm; struct date_time_info enddttm; struct directory_info *dir_info; int *iret; /************************************************************************ * dir_getflist * * * * This routine will scan the data directory for the existing file * * names. Only the files matching the requested file extension and * * the time constraits will be returned. * * The file names will be sorted in alphabetical order, which based * * on our yymmdd.ext data file naming convention, the latest appear * * as the last file in the file list. * * * * Input parameters: * * *dtyp_info struct Data type struct array * * idtyp int Index into struct array * * startdttm struct Start date/time information * * enddttm struct End date/time information * * * * Output parameters: * * *dir_info struct Directory struct array * * *iret int Return code * * * ** * * Log: * * S. Jacobs/NMC 7/94 * * C. Lin/EAI 8/95 rewrite for new nwx * ***********************************************************************/ { int i, ier; char direxp[133]; struct dirent **namelist; int itype; struct date_time_info curtim; int _select_dir(); extern int alphasort(); /*---------------------------------------------------------------------*/ *iret = G_NORMAL; /* * Get the current time. */ itype = 1; cfdate( &itype, &curtim.year, &curtim.month, &curtim.day, &curtim.hour, &curtim.minute, &ier ); /* * set the starting time */ if ( startdttm.year == -1 ) _sdttm[0] = '\0'; else { SET_DTTM(startdttm, curtim); sprintf( _sdttm, "%02d%02d%02d%02d", startdttm.year, startdttm.month, startdttm.day, startdttm.hour ); } /* * set the ending time */ SET_DTTM(enddttm, curtim); sprintf( _edttm, "%02d%02d%02d%02d", enddttm.year, enddttm.month, enddttm.day, enddttm.hour ); _dttmlen = strlen(_sdttm); /* * Set EXTEN for use in the SELECT_DIR function. */ sprintf( _exten, ".%s", dtyp_info[idtyp].filext ); _extlen = strlen(_exten); /* * Expand the environmental variable in the directory path. */ css_envr( dtyp_info[idtyp].datadir, direxp, &ier ); if ( ier == 0 ) { strcpy( dir_info->dirpath, direxp ); } else { strcpy( dir_info->dirpath, dtyp_info[idtyp].datadir ); } /* * Scan the directory, selecting only the files with the * correct file extension and time constraints. */ if ( ( dir_info->nent = scandir( dir_info->dirpath, &namelist, _select_dir, alphasort ) ) <= 0 ) { *iret = -1; return; } dir_info->cfilnum = dir_info->nent - 1; /* * Set the structure array of file names. */ for ( i = 0; i < dir_info->nent; i++ ) { strcpy( dir_info->filnam[i], namelist[i]->d_name ); free( namelist[i] ); } /* * Free the allocated space. */ free(namelist); } /*=====================================================================*/ int _select_dir ( check ) struct dirent *check; /************************************************************************ * _select_dir * * * * This function is used with the SCANDIR function to limit the search * * to the files matching the file extension for the data type and * * within the time constraints. * * * * Input parameters: * * *check struct Structure used by SCANDIR * * * * Output parameters: * * _select_dir int Function value * * 0 = Not a valid file * * 1 = Valid file * ** * * Log: * * S. Jacobs/NMC 7/94 * * C. Lin/EAI 8/95 use strcmp instead of strstr * * C. Lin/EAI 10/95 add time constraints checking * ***********************************************************************/ { int len; char *ymdhptr; int i,nondig,itmp; time_t file_time=0,start_time=0,end_time=0; struct tm time_str; /*---------------------------------------------------------------------*/ /* * Check for the file extension, date/time constraints in the file. */ len = strlen(check->d_name); /* do a Y2k and 4 digit YYYY fix */ /* find location of firts non digit */ i = 0; nondig = -1; while((i < len)&&(nondig < 0)) { if(! isdigit(check->d_name[i])) nondig = i; i++; } if(nondig > 9) /* assume YYYYMMDDHH file naming */ ymdhptr = check->d_name + 2; else ymdhptr = check->d_name; /* get start time */ if ( _sdttm != NULL ) { sscanf(_sdttm,"%2d%2d%2d%2d", &time_str.tm_year,&time_str.tm_mon,&time_str.tm_mday,&time_str.tm_hour); time_str.tm_mon -= 1; if(time_str.tm_year < 70) time_str.tm_year += 100; time_str.tm_sec = 0; time_str.tm_min = 0; time_str.tm_isdst = -1; start_time = mktime(&time_str); } sscanf(_edttm,"%2d%2d%2d%2d", &time_str.tm_year,&time_str.tm_mon,&time_str.tm_mday,&time_str.tm_hour); time_str.tm_mon -= 1; if(time_str.tm_year < 70) time_str.tm_year += 100; time_str.tm_sec = 0; time_str.tm_min = 0; time_str.tm_isdst = -1; end_time = mktime(&time_str); if(nondig > 7) /* dont try to make a time unless first 8 chars are digits */ { sscanf(ymdhptr,"%2d%2d%2d%2d", &time_str.tm_year,&time_str.tm_mon,&time_str.tm_mday,&time_str.tm_hour); time_str.tm_mon -= 1; if(time_str.tm_year < 70) time_str.tm_year += 100; time_str.tm_sec = 0; time_str.tm_min = 0; time_str.tm_isdst = -1; file_time = mktime(&time_str); } else file_time = 0; if ( _sdttm != NULL ) { if((start_time > file_time)||(file_time > end_time) || (strcmp(&(check->d_name[len - _extlen]), _exten) != 0) ) return ( 0 ); else return ( 1 ); } else { if((file_time > end_time) || (strcmp(&(check->d_name[len - _extlen]), _exten) != 0) ) return ( 0 ); else return ( 1 ); } } /*=====================================================================*/ void dir_getnextf ( dir_info, strtflg, file_info, iret ) struct directory_info *dir_info; int strtflg; struct data_file_info *file_info; int *iret; /************************************************************************ * dir_getnextf * * * * This routine will open the last file in the data directory. The * * assumption is that dir_info only contains desired files which meets * * file extension and date/time limits. * * * * dir_getnextf ( dir_info, strtflg, file_info, iret ) * * * * Input parameters: * * *dir_info struct Directory information * * strtflg int Start/resume flag * * -1 = Resume backward * * 0 = Start over * * 1 = Resume foreward * * * * Output parameters: * * *file_info struct Data file information * * *iret int Return code * * 0 -- new file * * 2 -- no new file * * 3 -- new file and also last file in * * forward/backward * * * ** * * Log: * * S. Jacobs/NMC 7/94 * * C. Lin/EAI 8/95 rewrite for new nwx from nwx2.1 * * G. Krueger/EAI 3/96 cleaned-out cfl_sopn declaration * * L. Williams/EAI 5/96 check for daily reports * * L. Williams/EAI 6/96 check for "S" data type * ***********************************************************************/ { int iflno, ier; char newfile, lastf; struct stat fsbuf; int i; /*---------------------------------------------------------------------*/ *iret = G_NORMAL; newfile = 1; lastf = 0; switch ( strtflg ) { case 0: /* start over, new product */ dir_info->cfilnum = dir_info->nent - 1; if( dir_info->nent == 1 ) { /* daily report */ lastf = 1; } break; case 1: /* foreward */ /* * check upper limit */ if ( dir_info->cfilnum < dir_info->nent - 1) dir_info->cfilnum ++; else newfile = 0; if ( dir_info->cfilnum == dir_info->nent-1 ) { if ( nwxTable->dtyp_info[srchInfo.idtyp].bsflag[0] == 'S' ) dir_info->cfilnum = dir_info->nent - 2 ; lastf = 1; } break; case -1: /* backward */ /* * check lower limit */ if ( dir_info->cfilnum > 0 ) { dir_info->cfilnum --; } else newfile = 0; if ( dir_info->cfilnum == 0 ) { if ( nwxTable->dtyp_info[srchInfo.idtyp].bsflag[0] == 'S' ) dir_info->cfilnum += 2; lastf = 1; } break; } /* * If new data file is found. */ if ( newfile ) { sprintf( file_info->filnam, "%s/%s", dir_info->dirpath, dir_info->filnam[dir_info->cfilnum]); *iret = 0; if ( lastf ) *iret = 3; } else { *iret = 2; } return; } /*=====================================================================*/
#include <Xm/Form.h> #include <Xm/Frame.h> #include <Xm/Label.h> #include <Xm/TextF.h> #include <Xm/BulletinB.h> #include <Xm/Text.h> #include <Xm/PushB.h> #include "gui.h" Widget txtw_create(); void txtw_prvnxtCb(); void txtw_prntbCb(); void txtw_prdgrpSet(); void txtw_dttmSet(); Widget prodtxtW; /* product group/name display */ Widget dttmtxtW; /* date/time display widget in text window */ Widget textW; /* widget to display text report */ Widget prevBtnW, nextBtnW, prntBtnW; /* previous,next,and print button */ /************************************************************************ * txtw.c * * * * This module creates the text display window and defines its * * callbacks. * * * * CONTENTS: * * txtw_create() creates the text report window. * * txtw_prvnxtCb() callback for the previous and next button. * * txtw_prntbCb() callback for the print button. * * txtw_prdgrpSet() set the prod/group name in text window. * * txtw_dttmSet() set date/time info in text window. * ***********************************************************************/ /*=====================================================================*/ Widget txtw_create( parent ) Widget parent; /************************************************************************ * txtw_create * * * * txtw_create ( parent ) * * * * Input parameters: * * parent Widget The top level widget * * * * Return parameters: * * Widget The text report window widget * ** * * Log: * * C. Lin/EAI 8/95 restructured from nwx2.1 * * L. Williams/EAI 5/96 remove XmNwidth, XmNheight and * * XmNcolumns from textW * ************************************************************************/ { Widget shell, txtform, frame, form, textbb, textcntl; int n; Arg wargs[10]; XmString msg; /*---------------------------------------------------------------------*/ /* * Create the text output window. */ shell = XtCreatePopupShell( "texttop", transientShellWidgetClass, parent, NULL, 0 ); XtVaSetValues(shell, XmNtitle, "Text Report", NULL); /* * MOTIF 1.1 has problem with taking out close item in mwm. */ if ((XmVERSION == 1) && (XmREVISION == 1)) XtVaSetValues(shell, XmNdeleteResponse, XmDO_NOTHING, NULL); else NxmMcloseNone(shell); txtform = XtVaCreateWidget("textform", xmFormWidgetClass, shell, NULL); /* * widgets for group/product info and date/time info */ frame = XtVaCreateWidget("frame", xmFrameWidgetClass, txtform, XmNshadowType, XmSHADOW_IN, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); form = XtVaCreateWidget("form", xmFormWidgetClass, frame, NULL); msg = XmStringCreateSimple(" "); prodtxtW = XtVaCreateManagedWidget("prodtxtW", xmLabelWidgetClass, form, XmNlabelString, msg, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 20, XmNleftAttachment, XmATTACH_FORM, NULL); XmStringFree(msg); dttmtxtW = XtVaCreateManagedWidget("dttmtxtW", xmTextFieldWidgetClass, form, XmNeditable, False, XmNcursorPositionVisible, False, XmNcolumns, 20, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); textbb = XtVaCreateManagedWidget( "textbb", xmBulletinBoardWidgetClass, txtform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frame, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL ); XtManageChild( form ); XtManageChild( frame ); /* * create text display window. */ n = 0; XtSetArg( wargs[n], XmNrows, 900 ); n++; XtSetArg( wargs[n], XmNscrollVertical, True ); n++; XtSetArg( wargs[n], XmNscrollHorizontal, True ); n++; XtSetArg( wargs[n], XmNeditMode, XmMULTI_LINE_EDIT ); n++; XtSetArg( wargs[n], XmNeditable, False); n++; XtSetArg( wargs[n], XmNcursorPositionVisible, False); n++; textW = XmCreateScrolledText( textbb, "textwin", wargs, n ); XtManageChild( textW ); textcntl = XtVaCreateManagedWidget( "textbb", xmBulletinBoardWidgetClass, txtform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, textbb, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNscrollVertical, True, NULL ); /* * create previous/next/print buttons */ prevBtnW = XtVaCreateManagedWidget( " Previous ", xmPushButtonWidgetClass, textcntl, XmNx, 50, XmNy, 40, NULL ); XtAddCallback( prevBtnW, XmNactivateCallback, txtw_prvnxtCb, (XtPointer) -1 ); nextBtnW = XtVaCreateManagedWidget( " Next ", xmPushButtonWidgetClass, textcntl, XmNx, 250, XmNy, 40, NULL ); XtAddCallback( nextBtnW, XmNactivateCallback, txtw_prvnxtCb, (XtPointer) 1 ); prntBtnW = XtVaCreateManagedWidget ( " Print ", xmPushButtonWidgetClass, textcntl, XmNx, 450, XmNy, 40, NULL ); XtAddCallback( prntBtnW, XmNactivateCallback, txtw_prntbCb, NULL ); XtSetSensitive( prevBtnW, False ); XtSetSensitive( nextBtnW, False ); XtManageChild(txtform); return(shell); } /*=====================================================================*/ void txtw_prvnxtCb( w, data, cb_data ) Widget w; XtPointer data; XtPointer cb_data; /************************************************************************ * txtw_prvnxtbCb * * * * This routine is the callback for the previous/next report button. * * The user may request the previous/next report for single stations * * only. * * * * txtw_prvnxtCb ( w, data, cb_data ) * * * * Input parameters: * * w Widget The input widget * * data XtPointer The input data for the widget * * cb_data XtPointer The callback data for the widget* * * ** * * S. Jacobs/NMC 8/94 * * L. Williams/EAI 12/94 Add code to process UVI info * * C. Lin/EAI 9/95 * ***********************************************************************/ { int which, iret; char tstr[25]; char *dtypflag, *datatype; /*---------------------------------------------------------------------*/ which = (int) data; /* * set the flag in usrSelect structure */ usrSelect.prvnxt = 1; /* * Set the search flag. */ srchInfo.sflag = which; switch ( which ) { case -1: /* previous button */ /* * activate next button */ if (!XtIsSensitive(nextBtnW) ) XtSetSensitive(nextBtnW, True); break; case 1: /* next button */ /* * activate previous button */ if (!XtIsSensitive(prevBtnW) ) XtSetSensitive(prevBtnW, True); break; } /* * read/display the text */ iret = fosd_txtrd(); /* * decode and plot data when necessary */ if ( (iret == 0) || (iret == -3) ) { if ( (plotData.mode == VALUE) || (plotData.mode == GRAPHIC) ) { fosd_decode(); fosd_plot(); } } if ( (iret == -6) || (iret == -3) ) { /* * no more previous/next report */ if ( which == -1 ) XtSetSensitive ( prevBtnW, False ); if ( which == 1 ) XtSetSensitive ( nextBtnW, False ); } } /*=====================================================================*/ void txtw_prntbCb ( w, data, cb_data ) Widget w; XtPointer data; XtPointer cb_data; /************************************************************************ * txtw_prntbCb * * * * This routine is the callback for the print report button. * * * * txtw_prntbCb ( w, data, cb_data ) * * * * Input parameters: * * w Widget The input widget * * data XtPointer The input data for the widget * * * * Output parameters: * * cb_data XtPointer The output data for the widget * ** * * S. Jacobs/NMC 8/94 * * S. Jacobs/NMC 9/94 Added print capability * * S. Jacobs/NMC 9/94 Updated to print large files * * C. Lin/EAI 9/95 Modified * * G. Krueger/EAI 3/96 CFL_SWOP -> CFL_WOPN * ***********************************************************************/ { int ier, iret; char filnam[73]; FILE *fpout; char command[33]; FILE *cfl_wopn ( ); /*---------------------------------------------------------------------*/ /* * Open the temporary file. */ strcpy( filnam, "/tmp/nwx.prnt" ); fpout = cfl_wopn( filnam, &iret ); if ( iret != 0 ) return; /* * Write the text to the temporary file. */ if ( printText[0] ) ier = fwrite( printText, sizeof(char), strlen(printText), fpout ); else ier = fwrite( reportText, sizeof(char), strlen(reportText), fpout ); fclose( fpout ); /* * Print the temporary file to the default printer. */ if ( ier != 0 ) { if (( MTMACH == MTHP )||(MTMACH == MTIRIS)) { strcpy( command, "lp -c /tmp/nwx.prnt" ); } else { strcpy( command, "lpr /tmp/nwx.prnt" ); } system( command ); sleep(5); /* * Remove the temporary file. */ unlink( filnam ); } } /*=====================================================================*/ void txtw_prdgrpSet() /************************************************************************ * txtw_prdgrpSet * * * * This function will display the group and product name on the text * * window as follows: * * * * group name: product name * * * * * * void txtw_prdgrpSet() * * * ** * * Log: * * L. Williams/EAI 08/95 * * C. Lin/EAI 10/95 * ************************************************************************/ { XmString msg; char title[100]; char *p; /*---------------------------------------------------------------------*/ p = (usrSelect.group)->prod[usrSelect.prod].prdname; while ( *p ) { if (*p == '*') *p = ' '; p++; } sprintf(title, "%s: %s", (usrSelect.group)->grpname, (usrSelect.group)->prod[usrSelect.prod].prdname); msg = XmStringCreateSimple(title); XtVaSetValues(prodtxtW, XmNlabelString, msg, NULL); XmStringFree(msg); } /*=====================================================================*/ void txtw_dttmSet() /************************************************************************ * txtw_dttmSet * * * * This function extracts the date from the filename and displays it on * * the text window * * * * * * void txtw_dttmSet() * * * ** * * Log: * * L. Williams/EAI 08/95 * * C. Lin/EAI 09/95 modify to use srchInfo * * change function name * * Chiz/Unidata 9/99 Made YYYY compatible, Y2K * ************************************************************************/ { char *months[]={"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; char year[3], month[3], day[3], hour[3]; char date[30], filnme[20]; int m,iy; char *ymdh; int nondig,i; /*---------------------------------------------------------------------*/ strcpy(filnme, srchInfo.dir_info.filnam[srchInfo.dir_info.cfilnum]); /* find location of firts non digit */ i = 0; nondig = -1; while((i < strlen(filnme))&&(nondig < 0)) { if(! isdigit(filnme[i])) nondig = i; i++; } if(nondig > 9) /* assume YYYYMMDDHH file naming */ ymdh = filnme + 2; else ymdh = filnme; strncpy(year, ymdh, 2); year[2] = (char)NULL; iy = atoi(year); strncpy(month, ymdh+2, 2); month[2] = (char)NULL; m = atoi(month); strncpy(day, ymdh+4, 2); day[2] = (char)NULL; strncpy(hour, ymdh+6, 2); hour[2] = (char)NULL; if(iy < 70) iy += 2000; else iy += 1900; sprintf(date, "%s GMT %s %s %4d", hour, day, months[m-1], iy); XmTextFieldSetString(dttmtxtW, date); } /*=====================================================================*/