source: trunk/src/seismic_processing/gmew/gm_config.c @ 6866

Revision 6866, 41.1 KB checked in by quintiliani, 4 years ago (diff)

Fix for max number of stations maxSta. Ticket #555

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
3 *   CHECKED IT OUT USING THE COMMAND CHECKOUT.
4 *
5 *    $Id$
6 *
7 *    Revision history:
8 *     $Log$
9 *     Revision 1.11  2009/08/25 00:10:40  paulf
10 *     added extraDelay parameter go gmew
11 *
12 *     Revision 1.10  2007/05/15 17:32:42  paulf
13 *     fixed qsort call (thanks to Ali M. from Utah for the catch
14 *
15 *     Revision 1.9  2006/03/15 14:21:54  paulf
16 *     SCNL version of gmew v0.2.0
17 *
18 *     Revision 1.8  2002/09/25 17:34:56  dhanych
19 *     added default value (3.0) for parameter snrThresh to initGM()
20 *
21 *     Revision 1.7  2002/02/28 17:03:36  lucky
22 *     Moved gma.c and gma.h to libsrc and main include
23 *
24 *     Revision 1.6  2001/07/18 19:41:36  lombard
25 *     Changed XMLDir, TempDir and MappingFile in GMPARAMS struct from string
26 *     arrays to string pointers. Changed gm_config.c and gm_util.c to support thes
27 *     changes. This solved a problem where the GMPARAMS structure was getting
28 *     corrupted when a pointer to it was passed into getGMFromTrace().
29 *     It's not clear why this was necessary; purify didn't complain.
30 *
31 *     Revision 1.5  2001/07/18 19:18:25  lucky
32 *     *** empty log message ***
33 *
34 *     Revision 1.4  2001/06/11 01:27:27  lombard
35 *     cleanup
36 *
37 *     Revision 1.3  2001/06/10 21:27:36  lombard
38 *     Changed single transport ring to input and output rings.
39 *     Added ability to handle multiple getEventsFrom commands.
40 *     Fixed handling of waveservers in config file.
41 *
42 *     Revision 1.2  2001/04/11 21:12:20  lombard
43 *     ../localmag/site.h ../localmag/lm_site.h
44 *
45 *     Revision 1.1  2001/03/30 19:14:25  lombard
46 *     Initial revision
47 *
48 *
49 *
50 */
51/*
52 * gm_config.c: routines to configure the gm module.
53 */
54
55
56#include <stdio.h>
57#include <stdlib.h>
58#include <string.h>
59#include <earthworm.h>
60#include <kom.h>
61#include <tlay.h>
62#include <ws_clientII.h>
63#include <gma.h>
64#include "gm_sac.h"
65#include "gm_util.h"
66#include "gm_ws.h"
67#include "gm_xml.h"
68#include "../localmag/lm_site.h"
69
70/* Internal Function Prototypes */
71static void initGM(GMPARAMS *);
72static int ReadConfig (GMPARAMS *, char * );
73
74#ifdef _WINNT
75/* Handle deprecation of strdup in windows */
76static char* mystrdup( const char* src ) {
77        char* dest = malloc( strlen(src) + 1 );
78        if ( dest != NULL )
79                strcpy( dest, src );
80        return dest;
81}
82#else
83#define mystrdup strdup
84#endif
85
86/*
87 * Configure: do all the configuration of gmew.
88 * This includes initializing the GMPARAMS structure, parsing the command-line
89 * arguments, parsing the config file, and checking configuration settings
90 * for consistency.
91 *    Returns: 0 on success
92 *            -1 on failure
93 */
94int Configure( GMPARAMS *pgmParams, int argc, char **argv, EVENT *pEvt, char *vsn)
95{
96  int rc = 0, logSwitch = 1;
97  int lenT, lenX;
98  char *configFile;
99  char *str, servDir[GM_MAXTXT];
100 
101  /* Set initial values, then parse the command-line options */
102  initGM( pgmParams );
103  if (argc == 2)
104    configFile = argv[1];
105  else
106  {
107    fprintf(stderr, "Usage: %s config-file\n", argv[0]);
108    fprintf(stderr, "   Version %s\n", vsn );
109    exit( -1 );
110  }
111   
112  /* Initialize the Earthworm logit system */
113  logit_init(configFile, 0, MAX_BYTES_PER_EQ, logSwitch);
114
115  /* Read the configuration file */
116  if ( (rc = ReadConfig( pgmParams, configFile )) < 0)
117    return rc;   /* Error; ReadConfig already complained */
118
119  /* Set defaults if they weren't already set */
120  if (pgmParams->traceSource == GM_UNDEF )
121    pgmParams->traceSource = GM_TS_WS;
122  if (pgmParams->saveTrace == GM_UNDEF)
123    pgmParams->saveTrace = GM_ST_NO;
124
125  /* Initialize the trace arrays.                                        */
126  if ( (rc = initBufs( pgmParams->maxTrace )) < 0)
127  {     /* initBufs already complained, so be silent here */
128    return rc;
129  }
130
131  switch( pgmParams->traceSource)
132  {
133  case GM_TS_WS:
134    if (pgmParams->pWSV == (WS_ACCESS *)NULL)
135    {   /* Set the default traceSource to wave_servers listed in *
136         * ${EW_PARAMS}/servers                                  */
137      if ( (str = getenv("EW_PARAMS")) == NULL)
138      {
139        logit("e", "Configure: environment variable EW_PARAMS not defined\n");
140        return -1;
141      }
142      if (strlen(str) > GM_MAXTXT - (strlen(DEF_SERVER) + 2))
143      {
144        logit("e", "Configure: environment variable EW_PARAMS too long;"
145              " increase GM_MAXTXT and recompile\n");
146        return -1;
147      }
148      sprintf(servDir, "%s/%s", str, DEF_SERVER);
149      if ( (pgmParams->pWSV = 
150            (WS_ACCESS *)calloc(1, sizeof(WS_ACCESS))) == 
151           (WS_ACCESS *)NULL)
152      {
153        logit("e", "Configure: out of memory for WS_ACCESS\n");
154        return -1;
155      }
156      if ( (pgmParams->pWSV->serverFile = mystrdup(servDir)) == NULL)
157      {
158        logit("e", "Configure: out of memory for serverFile\n");
159        return -1;
160      }
161    }
162    if (pgmParams->pWSV->pList == (SERVER *)NULL)
163    {
164      if (readServerFile(pgmParams) < 0)
165        return -1;
166    }
167    if (initWsBuf(pgmParams->maxTrace) < 0)
168    {
169      logit("e", "Configure: out of memory for trace_buf buffer\n");
170      return -1;
171    }
172    if (pgmParams->wsTimeout == 0)
173      pgmParams->wsTimeout = 5000;  /* Default, 5 seconds */
174    break;
175#ifdef EWDB
176  case GM_TS_EWDB:
177    if (pgmParams->pDBaccess == (DBACCESS *)NULL)
178    {
179      logit("e", 
180            "Configure: traceSource is EWDB but EWDBaccess not given\n");
181      rc = -1;
182    }
183    break;
184#endif
185  default:
186    logit("e", "Configure: unknown trace source <%d>.\n", 
187          pgmParams->traceSource);
188    rc = -1;
189  }
190
191  switch( pgmParams->respSource )
192  {
193  case GM_UNDEF:
194    logit("e", "Configure: required response source not specified\n");
195    rc = -1;
196    break;
197  case GM_RS_FILE:
198    /* Nothing to do for this */
199    break;
200#ifdef EWDB
201  case GM_RS_EWDB:
202    if (pgmParams->pDBaccess == NULL)
203    {
204      logit("e", 
205            "Configure: response source is EWDB but EWDBaccess not given\n");
206      rc = -1;
207    }
208    break;
209#endif
210  default:
211    logit("e", "Configure: unknown response source %d\n", 
212          pgmParams->respSource);
213    rc = -1;
214  }
215
216  /* Station Location Source: readConfig requires that it be set,
217        unless we're only responding to alarm messages */
218  switch (pgmParams->staLoc)
219  {
220  case GM_UNDEF:
221    break;
222  case GM_SL_HYP:
223    if ( site_read(pgmParams->staLocFile) < 0)
224      rc = -1;
225    break;
226#ifdef EWDB
227  case GM_SL_EWDB:
228    if ( pgmParams->pDBaccess == (DBACCESS *)NULL)
229    {
230      logit("e", "Configure: staLoc is EWDB but EWDBaccess not given\n");
231      rc = -1;
232    }
233    break;
234#endif
235  default:
236    logit("e", "Configure: unknown staLoc <%d>\n", pgmParams->staLoc);
237    rc = -1;
238  }
239 
240  if (pgmParams->saveTrace == GM_ST_SAC)
241  {  /* Initialize the SAC data array */
242    if ( initSACBuf( pgmParams->maxTrace ) < 0)
243    {
244      logit("e", "Configure: out of memory for SAC data\n");
245      return -1;
246    }
247  }
248
249  lenT = lenX = 0;
250  if (pgmParams->TempDir)
251    lenT = strlen(pgmParams->TempDir);
252  if (pgmParams->XMLDir)
253    lenX = strlen(pgmParams->XMLDir);
254  if ( lenT == 0 && lenX != 0)
255  {
256    logit("e", "XMLDir given but TempDir is missing\n");
257    rc = -1;
258  }
259
260  if (rc == 0)
261  {    /* Initialize the station list */
262    if ( (pEvt->Sta = (STA *)calloc( pgmParams->maxSta, sizeof(STA))) == 
263         (STA *)NULL)
264    {
265      logit("et", "Configure: out of memory for STA array\n");
266      return -1;
267    }
268
269    /* Turn on some debugging options */
270    if (pgmParams->debug & GM_DBG_WSC)
271      (void)setWsClient_ewDebug(1);
272 
273    if (pgmParams->debug & (GM_DBG_PZG | GM_DBG_TRS | GM_DBG_ARS))
274      transferDebug(pgmParams->debug >> 5);
275
276    /* Sort the SCNLPAR array to make searching more efficient */
277    if (pgmParams->numSCNLPar > 0)
278      qsort(pgmParams->pSCNLPar, pgmParams->numSCNLPar, sizeof(SCNLPAR),
279            CompareSCNLPARs);
280   
281    /* Initialize the XML mapping file */
282    if (lenX > 0)
283    {
284      if (pgmParams->MappingFile && strlen(pgmParams->MappingFile) != 0)
285      {
286        if (initMappings( pgmParams->MappingFile ) < 0)
287        {
288          logit("et", "gmew: error initializing mappings; exitting!\n");
289          rc = -1;
290        }
291      }
292    }
293  }
294 
295  return rc;
296}
297
298
299
300#define NUMREQ 9       /* Number of parameters that MUST be    */
301/*   set from the config file.          */
302
303/*      Function: ReadConfig                                            */
304static int ReadConfig (GMPARAMS *pgmParams, char *configfile )
305{
306  char     init[NUMREQ];  /* init flags, one byte for each required command */
307  int      nmiss;         /* number of required commands that were missed   */
308  char     *com;
309  char     *str;
310  char     *processor;
311  int      nfiles, rc;
312  int      i;
313  int      err = 0;
314  double dummy;
315  SCNLSEL   *newSel, *pAdd, *pDel;
316  char configPath[GM_MAXTXT], *paramsDir;
317  GMEW *pEW;
318 
319 
320  pEW = pgmParams->pEW;
321
322  pgmParams->waitTime=0;        /* don't wait by default since this seems to work for many small networks */
323 
324  pgmParams->LookAtVersion = vAll;   /* Look at all versions of all events */
325
326  pgmParams->alarmDuration=0; /* default: ignore alarm messages */
327  pgmParams->allowDuplicates=0; /* default: ignore dup channel names (including location code diffs) */
328  pgmParams->sendActivate=0; /* default: do not send ACTIVATE messages when done with XML files */
329 
330  /* Set to zero one init flag for each required command */
331  for (i = 0; i < NUMREQ; i++)
332    init[i] = 0;
333
334  /* Open the main configuration file
335**********************************/
336  nfiles = k_open (configfile); 
337  if (nfiles == 0) 
338  {
339    if ( (paramsDir = getenv("EW_PARAMS")) == NULL)
340    {
341      fprintf(stderr, "gma: Error opening command file <%s>; EW_PARAMS not set\n", 
342              configfile);
343      return -1;
344    }
345    strcpy(configPath, paramsDir);
346    if (configPath[strlen(configPath)-1] != '/' || 
347        configPath[strlen(configPath)-1] != '\\')
348      strcat(configPath, "/");
349    strcat(configPath, configfile);
350    nfiles = k_open (configPath); 
351    if (nfiles == 0) 
352    {
353      fprintf(stderr, "gma: Error opening command file <%s> or <%s>\n", 
354              configfile, configPath);
355      return -1;
356    }
357  }
358
359  /* Process all command files
360***************************/
361  while (nfiles > 0)   /* While there are command files open */
362  {
363    while (k_rd ())        /* Read next line from active file  */
364    { 
365      com = k_str ();         /* Get the first token from line */
366
367      processor = "ReadConfig";
368     
369      /* Ignore blank lines & comments
370*******************************/
371      if (!com)
372        continue;
373      if (com[0] == '#')
374        continue;
375
376     
377     
378      /* Open a nested configuration file */
379      if (com[0] == '@') 
380      {
381        if ( (rc = k_open (&com[1])) == 0)
382        {
383          fprintf(stderr, "gma: Error opening command file <%s>\n", 
384                  &com[1]);
385          return -1;
386        }
387        nfiles = rc;
388        continue;
389      }
390
391      /* Station location source: required to process HYP2000ARC messages */
392      else if (k_its("staLoc") )
393      {
394        if ( (str = k_str()) )
395        {
396          if (k_its("File") )
397          {
398            if ( (str = k_str()) )
399            {
400              if ( (pgmParams->staLocFile = mystrdup(str)) == NULL)
401              {
402                logit("e", "ReadConfig: out of memory for staLoc\n");
403                return -1;
404              }
405              pgmParams->staLoc = GM_SL_HYP;
406              init[0] = 1;
407            }
408            else
409            {
410              logit("e", "ReadConfig: \"staLoc File\" missing filename\n");
411              err = -1;
412            }
413          }
414#ifdef EWDB
415          else if (k_its("EWDB") )
416          {
417            pgmParams->staLoc = GM_SL_EWDB;
418            init[0] = 1;
419          }
420#endif
421          else
422          {
423            logit("e", "ReadConfig: Unknown \"staLoc\": <%s>\n", str);
424            err = -1;
425          }
426        }
427        else
428        {
429          logit("e", "ReadConfig: \"staLoc\" missing argument\n");
430          err = -1;
431        }
432      }
433     
434      /* MaxSta: required */
435      else if (k_its("maxSta") )
436      {
437        pgmParams->maxSta = k_int();
438        /* tell lm_site.c about max size */
439        set_maxsite( pgmParams->maxSta );
440        init[1] = 1;
441      }
442     
443      /* MaxDist: required to process HYP2000ARC messages */
444      else if (k_its("maxDist") )
445      {
446        pgmParams->maxDist = k_val();
447        init[2] = 1;
448      }
449     
450      /* maxTrace: required */
451      else if (k_its("maxTrace") )
452      {
453        pgmParams->maxTrace = (long)k_int();
454        init[3] = 1;
455      }
456     
457      /* Trace length (time): optional */
458      else if (k_its("traceTimes") )
459      {
460        pgmParams->traceStart = k_val();
461        pgmParams->traceEnd = k_val();
462      }
463     
464      /* Peak Search window parameters: optional */
465      else if (k_its("searchWindow") )
466      {
467        pgmParams->peakSearchStart = k_val();
468        pgmParams->peakSearchStartMin = k_val();
469        pgmParams->peakSearchEnd = k_val();
470        pgmParams->peakSearchEndMin = k_val();
471      }
472     
473      /* SNR threshold */
474      else if (k_its("snrThresh") )
475        pgmParams->snrThresh = k_val();
476
477      /* waitTime is in seconds to wait before processing an event */
478      else if (k_its("extraDelay") )
479      {
480        pgmParams->waitTime = k_val();
481      }
482     
483      /* LookAtVersion: optional */
484      else if (k_its("LookAtVersion") )
485      {
486        if ( (str = k_str()) )
487        {
488            if(strcmp(str, "All") == 0 ) {
489                pgmParams->LookAtVersion = vAll;   /* Look at all versions of all events */
490                logit("t", "readConfig: looking at all versions of the events.\n");
491            } else if(strcmp(str, "Prelim") == 0 ) {
492                pgmParams->LookAtVersion = vPrelim;   /* Look only at version Prelim of all events */
493                logit("t", "readConfig: looking only at version Prelim of the events.\n");
494            } else if(strcmp(str, "Rapid") == 0 ) {
495                pgmParams->LookAtVersion = vRapid;   /* Look only at version Rapid of all events */
496                logit("t", "readConfig: looking only at version Rapid of the events.\n");
497            } else if(strcmp(str, "Final") == 0 ) {
498                pgmParams->LookAtVersion = vFinal;   /* Look only at version Final of all events */
499                logit("t", "readConfig: looking only at version Final of the events.\n");
500            } else {
501                logit("e", "readConfig: value for optional parameter LookAtVersion is not valid. Possible values are the string: All, Prelim, Rapid or Final.\n");
502                return -1;
503            }
504        }
505      }
506
507      /* SCNL Selectors: optional */
508      else if (k_its("Add") )
509      {
510        if ( (str = k_str()) )  /* sta */
511        {
512          if ( (newSel = (SCNLSEL *)calloc(1, sizeof(SCNLSEL))) == NULL)
513          {
514            fprintf(stderr, "ReadConfig: out of memory for SCNLSEL\n");
515            return -1;
516          }
517          strncpy(newSel->sta, str, 6);
518          if ( (str = k_str()) )  /* comp */
519          {
520            strncpy(newSel->comp, str, 8);
521            if ( (str = k_str()) )  /* net */
522            {
523              strncpy(newSel->net, str, 8);
524              if ( (str = k_str()) )  /* loc */
525              {
526               strncpy(newSel->loc, str, 3);
527               if (pgmParams->pAdd == (SCNLSEL *)NULL)
528               {
529                 pgmParams->pAdd = newSel;
530                 pAdd = newSel;   /* Leave it pointing at the end of list */
531               }
532               else
533               {
534                 pAdd->next = newSel;
535                 pAdd = newSel;
536               }
537              }
538              else
539              {
540                fprintf(stderr, "ReadConfig: \"Add\" missing 1 of 5 arguments\n");
541                err = -1;
542                free(newSel);
543              }
544            }
545            else
546            {
547              fprintf(stderr, "ReadConfig: \"Add\" missing 2 of 5 arguments\n");
548              err = -1;
549              free(newSel);
550            }
551          }
552          else
553          {
554            fprintf(stderr, 
555                    "ReadConfig: \"Add\" missing 3 of 5 arguments\n");
556            err = -1;
557            free(newSel);
558          }
559        }
560        else
561        {
562          fprintf(stderr, "ReadConfig: \"Add\" missing 4 of 5 arguments\n");
563          err = -1;
564        }
565      }
566
567      /* SCN Deleteions: optional */
568      else if (k_its("Del") )
569      {
570        if ( (str = k_str()) )  /* sta */
571        {
572          if ( (newSel = (SCNLSEL *)calloc(1, sizeof(SCNLSEL))) == NULL)
573          {
574            fprintf(stderr, "ReadConfig: out of memory for SCNLSEL\n");
575            return -1;
576          }
577          strncpy(newSel->sta, str, 6);
578          if ( (str = k_str()) )  /* comp */
579          {
580            strncpy(newSel->comp, str, 8);
581            if ( (str = k_str()) )  /* net */
582            {
583              strncpy(newSel->net, str, 8);
584             if ( (str = k_str()) )  /* loc */
585              {
586                strncpy(newSel->loc, str, 3);
587                if (pgmParams->pDel == (SCNLSEL *)NULL)
588                {
589                  pgmParams->pDel = newSel;
590                  pDel = newSel;   /* Leave it pointing at the end of list */
591                }
592                else
593                {
594                  pDel->next = newSel;
595                  pDel = newSel;
596                }
597              }
598            else
599            {
600              fprintf(stderr, "ReadConfig: \"Del\" missing 1 of 5 arguments\n");
601              err = -1;
602              free(newSel);
603            }
604          }
605            else
606            {
607              fprintf(stderr, "ReadConfig: \"Del\" missing 2 of 5 arguments\n");
608              err = -1;
609              free(newSel);
610            }
611          }
612          else
613          {
614            fprintf(stderr, 
615                    "ReadConfig: \"Del\" missing 3 of 5 arguments\n");
616            err = -1;
617            free(newSel);
618          }
619        }
620        else
621        {
622          fprintf(stderr, "ReadConfig: \"Del\" missing 4 arguments\n");
623          err = -1;
624        }
625      }
626
627      /* Trace Source: optional */
628      else if (k_its( "traceSource" ))
629      {
630        if (pgmParams->traceSource == GM_UNDEF)
631        {                 /* Let command-line take precedence */
632          if ( (str = k_str()) )
633          {
634            if (k_its("waveServer"))
635            {
636              pgmParams->traceSource = GM_TS_WS;
637              if ( (str = k_str()) )
638              {
639                if ( (pgmParams->pWSV = 
640                      (WS_ACCESS *)calloc(1, sizeof(WS_ACCESS))) == NULL)
641                {
642                  logit("e", 
643                        "ReadConfig: out of memory for SERVER\n");
644                  return -1;
645                }
646                if (k_its("File"))
647                {
648                  if ( (str = k_str()) )
649                  {
650                    if ( (pgmParams->pWSV->serverFile = mystrdup(str)) == NULL)
651                    {
652                      logit("e", 
653                            "ReadConfig: out of memory for serverFile\n");
654                      return -1;
655                    }
656                  }
657                  else
658                  {
659                    logit("e", 
660                          "ReadConfig: \"traceSource waveServer file\" missing filename\n");
661                    err = -1;
662                  }
663                }
664                else
665                {
666                  int ws_err;
667                  while(str)
668                  {
669                    if (Add2ServerList(str, pgmParams) < 0)
670                      err = -1;  /* Add2ServerList already complained */
671                    str = k_str();
672                    /* We have to catch the kom error here since we are *
673                     * intentionally trying to read to the end of the   *
674                     * string.                                          */
675                    ws_err = k_err();
676                    if (ws_err == -17 && pgmParams->pWSV->pList != 
677                        (PSERVER) NULL)
678                      continue;
679                    else if (ws_err < 0)
680                    {
681                      logit("e", 
682                            "ReadConfig: Bad <%s> command in <%s>\n\t%s\n",
683                            processor, configfile, k_com());
684                      return -1;
685                    }
686                  }
687                }
688                /* else default waveServer file is "servers" in $EW_PARAMS dir */
689              }
690            }
691          }
692          else
693          {
694            logit("e", "ReadConfig: Missing traceSource argument\n");
695            err = -1;
696          }
697        } /* else already set from command-line */
698      }
699     
700      /* Response Source: optional */
701      else if (k_its("respSource") )
702      {
703        if ( (str = k_str()) )
704        {
705          if (k_its("File") )
706          {
707            if ( (str = k_str()) )
708            {
709              if ( (pgmParams->respDir = mystrdup(str)) == NULL)
710              {
711                logit("e", "ReadConfig: out of memory for respDir\n");
712                return -1;
713              }
714              if ( (str = k_str()) )
715              {
716                if ( (pgmParams->respNameFormat = mystrdup(str)) == NULL)
717                {
718                  logit("e", 
719                        "ReadConfig: out of memory for respNameFormat\n");
720                  free(pgmParams->respDir);
721                  pgmParams->respDir = NULL;
722                  return -1;
723                }
724                pgmParams->respSource = GM_RS_FILE;
725              }
726              else
727              {
728                logit("e", 
729                      "ReadConfig: \"respSource FILE\" missing pz-filename-format\n");
730                err = -1;
731              }
732            }
733            else
734            {
735              logit("e", 
736                    "ReadConfig: \"respSource File\" missing 2 arguments\n");
737              err = -1;
738            }
739          }
740#ifdef EWDB
741          else if (k_its("EWDB") )
742          {
743            pgmParams->respSource = GM_RS_EWDB;
744          }
745#endif
746          else
747          {
748            logit("e", "ReadConfig: unknown \"respSource\" <%s>\n", str);
749            err = -1;
750          }
751        }
752        else
753        {
754          logit("e", "ReadConfig: \"respSource\" missing argument\n");
755          err = -1;
756        }
757      }
758     
759      /* the responses are in meters, from rdseed -pf, convert them to nanometers when read in */
760      else if (k_its("ResponseInMeters") )
761        setResponseInMeters( 1 );
762
763      /* Save Trace: optional */
764      else if (k_its("saveTrace") )
765      {
766        if (pgmParams->saveTrace == GM_UNDEF)
767        {
768          if ( (str = k_str()) )
769          {
770            if (k_its("None") )
771              pgmParams->saveTrace = GM_ST_NO;
772            else if (k_its("SAC") )
773            {
774              pgmParams->saveTrace = GM_ST_SAC;
775              if ( (str = k_str()) )
776              {
777                if ( (pgmParams->sacOutDir = mystrdup(str)) == (char *)NULL)
778                {
779                  logit("e", "readConfig: out of memory for sacOutDir\n");
780                  return -1;
781                } 
782                if ( (str = k_str()) )
783                {
784                  if ( (pgmParams->saveDirFormat = mystrdup(str)) == 
785                       (char *)NULL)
786                  {
787                    logit("e", "readConfig: out of memory for saveDirFormat\n");
788                    return -1;
789                  }
790                  if ( (str = k_str()) )
791                  {
792                    if ( (pgmParams->saveNameFormat = mystrdup(str)) == NULL)
793                    {
794                      logit("e", 
795                            "ReadConfig: out of memory for saveNameFormat\n");
796                      return -1;
797                    }
798                  }
799                  else
800                  {
801                    logit("e", 
802                          "ReadConfig: \"saveTrace SAC\" missing 1 argument\n");
803                    err = -1;
804                  }
805                }
806                else
807                {
808                  logit("e",
809                        "ReadConfig: \"saveTrace SAC\" missing 2 arguments\n");
810                  err = -1;
811                }
812              }
813              else
814              {
815                logit("e",
816                      "ReadConfig: \"saveTrace SAC\" missing 3 arguments\n");
817                err = -1;
818              }
819            }
820            else
821            {
822              logit("e", "ReadConfig: unknown \"saveTrace\" arg <%s>\n", str);
823              err = -1;
824            }
825          }
826          else
827          {
828            logit("e", "ReadConfig: \"saveTrace\" missing argument\n");
829            err = -1;
830          }
831        }
832      }
833     
834
835      /* SCNL Parameters: optional */
836      else if (k_its("SCNLpar") )
837      {
838        if (pgmParams->numSCNLPar >= pgmParams->maxSCNLPar)
839        {
840          pgmParams->maxSCNLPar += 10;
841          if ( (pgmParams->pSCNLPar = 
842                (SCNLPAR *)realloc(pgmParams->pSCNLPar, sizeof(SCNLPAR) *
843                                  pgmParams->maxSCNLPar)) == (SCNLPAR *)NULL)
844          {
845            fprintf(stderr, "ReadConfig: out of memory for %d SCNLPARs\n",
846                    pgmParams->maxSCNLPar);
847            return -1;
848          }
849        }
850        if ( (str = k_str()) == NULL)
851        {
852          fprintf(stderr, "ReadConfig: Bad \"SCNLPar\" command\n");
853          return -1;
854        }
855        strncpy(pgmParams->pSCNLPar[pgmParams->numSCNLPar].sta, str, 
856                TRACE_STA_LEN);
857        if ( (str = k_str()) == NULL)
858        {
859          fprintf(stderr, "ReadConfig: Bad \"SCNLPar\" command\n");
860          return -1;
861        }
862        strncpy(pgmParams->pSCNLPar[pgmParams->numSCNLPar].comp, str, 
863                TRACE_CHAN_LEN);
864        if ( (str = k_str()) == NULL)
865        {
866          fprintf(stderr, "ReadConfig: Bad \"SCNLPar\" command\n");
867          return -1;
868        }
869        strncpy(pgmParams->pSCNLPar[pgmParams->numSCNLPar].net, str,
870                TRACE_NET_LEN);
871        if ( (str = k_str()) == NULL)
872        {
873          fprintf(stderr, "ReadConfig: Bad \"SCNLPar\" command\n");
874          return -1;
875        }
876        strncpy(pgmParams->pSCNLPar[pgmParams->numSCNLPar].loc, str,
877                TRACE_LOC_LEN);
878        dummy = k_val(); /* Throw away the station magnitude correction */
879        pgmParams->pSCNLPar[pgmParams->numSCNLPar].fTaper[0] = k_val();
880        pgmParams->pSCNLPar[pgmParams->numSCNLPar].fTaper[1] = k_val();
881        pgmParams->pSCNLPar[pgmParams->numSCNLPar].fTaper[2] = k_val();
882        pgmParams->pSCNLPar[pgmParams->numSCNLPar].fTaper[3] = k_val();
883        pgmParams->pSCNLPar[pgmParams->numSCNLPar].clipLimit = k_val();
884        pgmParams->pSCNLPar[pgmParams->numSCNLPar].taperTime = k_val();
885        pgmParams->numSCNLPar++;
886      }
887       
888#ifdef EWDB
889      /* Earthworm Database access: optional */
890      else if (k_its("EWDBaccess") )
891      {
892        if ( (str = k_str()) )
893        {
894          if ( (pgmParams->pDBaccess = 
895                (DBACCESS *)calloc(1, sizeof(DBACCESS))) == NULL)
896          {
897            logit("e", "ReadConfig: out of memory for DBACCESS\n");
898            return -1;
899          }
900          if ( (pgmParams->pDBaccess->user = mystrdup(str)) == NULL)
901          {
902            logit("e", "ReadConfig: out of memory for DBA user\n");
903            return -1;
904          }
905          if ( (str = k_str()) )
906          {
907            if ( (pgmParams->pDBaccess->pwd = mystrdup(str)) == NULL)
908            {
909              logit("e", "ReadConfig: out of memory for DBA password\n");
910              return -1;
911            }
912            if (  (str = k_str()) )
913            {
914              if ( (pgmParams->pDBaccess->service = mystrdup(str)) == NULL)
915              {
916                logit("e", "ReadConfig: out of memory for DBA service\n");
917                return -1;
918              }
919            }
920            else
921            {
922              logit("e", 
923                    "ReadConfig: \"EWDBaccess\" missing arguments; 3 required\n");
924              err = -1;
925            }
926          }
927          else
928          {
929            logit("e", 
930                  "ReadConfig: \"EWDBaccess\" missing arguments; 3 required\n");
931            err = -1;
932          }
933        }
934        else
935        {
936          logit("e", 
937                "ReadConfig: \"EWDBaccess\" missing arguments; 3 required\n");
938          err = -1;
939        }
940      }
941#endif     
942
943      /* Earthworm transport stuff */
944      else if (k_its("HeartBeatInterval") )
945      {
946        pgmParams->HeartBeatInterval = k_int();
947        init[4] = 1;       
948      }
949
950      else if (k_its("RingInName") )
951      {
952        if ((str = k_str ()) != NULL)
953        {
954          if( ( pEW->RingInKey = GetKey(str) ) == -1 ) 
955          {
956            logit("e", "ReadConfig:  Invalid input ring name <%s>", str);
957            err = -1;
958          }
959          init[5] = 1;
960        }
961        else
962        {
963          logit("e", "ReadConfig: \"RingInName\" missing argument\n");
964          err = -1;
965        }
966      }
967
968      else if (k_its("RingOutName") )
969      {
970        if ((str = k_str ()) != NULL)
971        {
972          if( ( pEW->RingOutKey = GetKey(str) ) == -1 ) 
973          {
974            logit("e", "ReadConfig:  Invalid output ring name <%s>", str);
975            err = -1;
976          }
977          init[6] = 1;
978        }
979        else
980        {
981          logit("e", "ReadConfig: \"RingOutName\" missing argument\n");
982          err = -1;
983        }
984      }
985
986      else if (k_its ("MyModId")) 
987      {
988        if ((str = k_str ()) != NULL)
989        {
990          if ( GetModId( str, &pEW->hrtLogo.mod ) != 0 ) 
991          {
992            logit("e", "ReadConfig: Invalid module name <%s>", str );
993            return( -1 );
994          }
995          if ( GetLocalInst( &pEW->hrtLogo.instid ) != 0 ) 
996          {
997            logit("e", "ReadConfig: error getting local installation id" );
998            return( -1 );
999          }
1000          if ( GetType( "TYPE_HEARTBEAT", &pEW->hrtLogo.type ) != 0 ) 
1001          {
1002            logit("e", 
1003          "ReadConfig: Invalid message type <TYPE_HEARTBEAT>; exiting!\n" );
1004            return( -1 );
1005          }
1006          pEW->errLogo.mod = pEW->hrtLogo.mod;
1007          pEW->errLogo.instid = pEW->hrtLogo.instid;
1008          if ( GetType( "TYPE_ERROR", &pEW->errLogo.type ) != 0 ) 
1009          {
1010            logit("e", "ReadConfig: Invalid message type <TYPE_ERROR>" );
1011            return( -1 );
1012          }
1013
1014          pEW->gmLogo.mod =  pEW->hrtLogo.mod;
1015          pEW->gmLogo.instid =  pEW->hrtLogo.instid;
1016          if ( GetType( "TYPE_STRONGMOTIONII", &pEW->gmLogo.type ) != 0)
1017          {
1018            logit("e", "ReadConfig: Invalid msg type <TYPE_STRONGMOTIONII>" );
1019            return( -1 );
1020          }
1021
1022          pEW->ha2kLogo.mod =  pEW->hrtLogo.mod;
1023          pEW->ha2kLogo.instid =  pEW->hrtLogo.instid;
1024
1025          pEW->amLogo.mod =  pEW->hrtLogo.mod;
1026          pEW->amLogo.instid =  pEW->hrtLogo.instid;
1027
1028          pEW->threshLogo.mod =  pEW->hrtLogo.mod;
1029          pEW->threshLogo.instid =  pEW->hrtLogo.instid;
1030        }
1031        init[7] = 1;
1032      }
1033      else if (k_its("getEventsFrom") )
1034      {
1035        MSG_LOGO *tLogo = NULL;
1036        tLogo = (MSG_LOGO *)realloc( pEW->GetLogo, (pEW->nGetLogo+1) * 
1037                                     sizeof(MSG_LOGO));
1038        if( tLogo == NULL )
1039        {
1040          logit("e", "ReadConfig: getEventsFrom: error reallocing"
1041                " %d bytes; exiting!\n",
1042                (pEW->nGetLogo+1)*sizeof(MSG_LOGO) );
1043          return( -1 );
1044        }
1045        pEW->GetLogo = tLogo;
1046        if ((str = k_str ()) != NULL)
1047        {
1048          if ( GetInst( str, &(pEW->GetLogo[pEW->nGetLogo].instid) ) != 0 )
1049          {
1050            logit("e", "ReadConfig: getEventsFrom: invalid installation `%s'\n",
1051                  str );
1052            return( -1 );
1053          }
1054        }
1055        if( ( str = k_str() ) != NULL )
1056        {
1057          if ( GetModId( str, &(pEW->GetLogo[pEW->nGetLogo].mod) ) != 0 )
1058          {
1059            logit("e", "ReadConfig: getEventsFrom: invalid module id `%s'\n",
1060                  str );
1061            return( -1 );
1062          }
1063        }
1064        if ( GetType( "TYPE_HYP2000ARC", &(pEW->GetLogo[pEW->nGetLogo].type) ) != 0 )
1065        {
1066          logit("e", "ReadConfig: getEventsFrom: invalid msgtype `%s'\n", 
1067                "TYPE_HYP2000ARC");
1068          return( -1 );
1069        }
1070        pEW->ha2kLogo.type = pEW->GetLogo[pEW->nGetLogo].type;
1071        pEW->nGetLogo++;
1072        init[8] = 1;
1073      }
1074       
1075      /* Optional: wave_server timeout */
1076      else if (k_its("wsTimeout") )
1077      {
1078        pgmParams->wsTimeout = k_int();
1079      }
1080
1081      /* Optional XML stuff */
1082      else if (k_its( "XMLDir" ) )
1083      {
1084        if ( (str = k_str()) )
1085        {
1086          if ( (pgmParams->XMLDir = mystrdup(str)) == NULL)
1087          {
1088            logit("e", "ReadConfig: out of memory for XMLDir\n");
1089            return -1;
1090          }
1091        }
1092        else
1093        {
1094          fprintf( stderr, "gmew: Bad <XMLDir> command in <%s>;"
1095                   " exiting!\n", configfile );
1096          err = -1;
1097        }
1098      }
1099      else if (k_its( "TempDir" ) )
1100      {
1101        if ( (str = k_str()) )
1102        {
1103          if ( ( pgmParams->TempDir = mystrdup(str)) == NULL)
1104          {
1105            logit("e", "ReadConfig: out of memory for TempDir\n");
1106            return -1;
1107          }
1108        }
1109        else
1110        {
1111          fprintf( stderr, "gmew: Bad <TempDir> command in <%s>;"
1112                   " exiting!\n", configfile );
1113          err = -1;
1114        }
1115      }
1116      else if (k_its( "MappingFile" ) )
1117      {
1118        if ( (str = k_str()) )
1119        {
1120          if ( ( pgmParams->MappingFile = mystrdup(str)) == NULL)
1121          {
1122            logit("e", "ReadConfig: out of memory for MappingFile\n");
1123            return -1;
1124          }
1125        }
1126        else
1127        {
1128          fprintf( stderr, "gmew: Bad <MappingFile> command in <%s>;"
1129                   " exiting!\n", configfile );
1130          err = -1;
1131        }
1132      }
1133     
1134      /* Optional: debug command */
1135      else if (k_its( "Debug") )
1136      {
1137        pgmParams->debug |= k_int();
1138      }
1139     
1140      /* Optional: Respond to dup SCNs - note location code was ignored otherwise if multiple at a sta */
1141      else if (k_its( "allowDuplicates") )
1142      {
1143        pgmParams->allowDuplicates = 1;
1144      }
1145      /* Optional: send activation requests */
1146      else if (k_its( "sendActivateLogo") )
1147      {
1148      /* get the module ide to use for send activate */
1149        str = k_str();
1150        if ( GetModId( str, &(pEW->amLogo.mod) ) != 0 )
1151        {
1152          logit("e", "ReadConfig: sendActivateLogo: invalid module  string %s\n", str);
1153          return( -1 );
1154        }
1155      }
1156      else if (k_its( "sendActivate") )
1157      {
1158        if ( GetType( "TYPE_ACTIVATE_MODULE", &(pEW->amLogo.type) ) != 0 )
1159        {
1160          logit("e", "ReadConfig: sendAlarm: invalid msgtype `TYPE_ACTIVATE_MODULE'\n");
1161          return( -1 );
1162        }
1163        pgmParams->sendActivate = 1;
1164      }
1165     /* Optional: Respond to thresh alarms */
1166     else if (k_its( "watchForThreshAlert") )
1167     {
1168       MSG_LOGO *tLogo = NULL;
1169       tLogo = (MSG_LOGO *)realloc( pEW->GetLogo, (pEW->nGetLogo+1) * 
1170                                    sizeof(MSG_LOGO));
1171       if( tLogo == NULL )
1172       {
1173         logit("e", "ReadConfig: watchForThreshAlert: error reallocing"
1174               " %d bytes; exiting!\n",
1175               (pEW->nGetLogo+1)*sizeof(MSG_LOGO) );
1176         return( -1 );
1177       }
1178       pEW->GetLogo = tLogo;
1179if ( GetInst( "INST_WILDCARD", &(pEW->GetLogo[pEW->nGetLogo].instid) ) != 0 )
1180{
1181  logit("e", "ReadConfig: watchForThreshAlert: invalid installation `INST_WILDCARD'\n");
1182  return( -1 );
1183}
1184   if ( GetModId( "MOD_WILDCARD", &(pEW->GetLogo[pEW->nGetLogo].mod) ) != 0 )
1185       {
1186         logit("e", "ReadConfig: watchForThreshAlert: invalid module id `MOD_WILDCARD'\n");
1187         return( -1 );
1188       }
1189       if ( GetType( "TYPE_THRESH_ALERT", &(pEW->GetLogo[pEW->nGetLogo].type) ) != 0 )
1190       {
1191         logit("e", "ReadConfig: watchForThreshAlert: invalid msgtype `TYPE_THRESH_ALERT'\n");
1192         return( -1 );
1193       }
1194       pEW->threshLogo.type = pEW->GetLogo[pEW->nGetLogo].type;
1195        str = k_str();
1196        if ( str ) {
1197                pgmParams->threshDuration = atoi( str );
1198                if ( pgmParams->threshDuration <= 0 ) {
1199                        logit("e", "ReadConfig: watchForThreshAlert: invalid duration '%s'; ignoring\n",
1200                                str );
1201                        pgmParams->threshDuration = 0;
1202                }
1203        } else {
1204            k_err();    /* Clear the error of not finding a duration argument */
1205                pgmParams->threshDuration = 20;
1206        }
1207       pEW->nGetLogo++;
1208     }
1209     /* Optional: Respond to activation requests */
1210      else if (k_its( "watchForAlarm") )
1211      {
1212        MSG_LOGO *tLogo = NULL;
1213        tLogo = (MSG_LOGO *)realloc( pEW->GetLogo, (pEW->nGetLogo+1) * 
1214                                     sizeof(MSG_LOGO));
1215        if( tLogo == NULL )
1216        {
1217          logit("e", "ReadConfig: watchForAlarm: error reallocing"
1218                " %d bytes; exiting!\n",
1219                (pEW->nGetLogo+1)*sizeof(MSG_LOGO) );
1220          return( -1 );
1221        }
1222        pEW->GetLogo = tLogo;
1223            if ( GetInst( "INST_WILDCARD", &(pEW->GetLogo[pEW->nGetLogo].instid) ) != 0 )
1224            {
1225                  logit("e", "ReadConfig: watchForAlarm: invalid installation `INST_WILDCARD'\n");
1226                  return( -1 );
1227            }
1228        if ( GetModId( "MOD_WILDCARD", &(pEW->GetLogo[pEW->nGetLogo].mod) ) != 0 )
1229        {
1230          logit("e", "ReadConfig: watchForAlarm: invalid module id `MOD_WILDCARD'\n");
1231          return( -1 );
1232        }
1233        if ( GetType( "TYPE_ACTIVATE_MODULE", &(pEW->GetLogo[pEW->nGetLogo].type) ) != 0 )
1234        {
1235          logit("e", "ReadConfig: watchForAlarm: invalid msgtype `TYPE_ACTIVATE_MODULE'\n");
1236          return( -1 );
1237        }
1238        pEW->amLogo.type = pEW->GetLogo[pEW->nGetLogo].type;
1239        str = k_str();
1240        if ( str ) {
1241                pgmParams->alarmDuration = atoi( str );
1242                if ( pgmParams->alarmDuration <= 0 ) {
1243                        logit("e", "ReadConfig: watchForAlarm: invalid duration '%s'; ignoring\n",
1244                                str );
1245                        pgmParams->alarmDuration = 0;
1246                }
1247        } else
1248                pgmParams->alarmDuration = 60;
1249        pEW->nGetLogo++;
1250      }
1251     
1252      /* Optional: additional spectral response frequency */
1253      else if (k_its( "AddSpectraResponseAt") )
1254      {
1255        addSR2list( k_val() );
1256          }
1257
1258      /* Optional: additional spectral response frequency */
1259      else if (k_its( "PreTriggerSeconds") )
1260      {
1261        pgmParams->preTriggerSeconds = k_int();
1262          }
1263
1264      else if( t_com()      ) processor = "t_com";
1265
1266      /* Unknown command */ 
1267      else 
1268      {
1269        fprintf(stderr, "ReadConfig: <%s> Unknown command in <%s>.\n", 
1270                com, configfile);
1271        continue;
1272      }
1273
1274      /* See if there were any errors processing the command */
1275      if (k_err ()) 
1276      {
1277        fprintf(stderr, 
1278                "gma: Bad <%s> command in <%s>\n\t%s\n",
1279                processor, configfile, k_com());
1280        return -1;
1281      }
1282
1283    } /** while k_rd() **/
1284
1285    nfiles = k_close ();
1286
1287  } /** while nfiles **/
1288
1289 
1290  if ( pgmParams->alarmDuration ) {
1291        /* WatchForAlarm present, so might not need to handle HYP2000ARC messages */
1292        if ( !init[0] || !init[2] ) {
1293                fprintf( stderr, "Warning: program cannot respond to HYP2000ARC messages:\n" );
1294                if ( !init[0] )
1295                        fprintf( stderr, "\tmissing <staLoc> command\n");
1296                if ( !init[0] )
1297                        fprintf( stderr, "\tmissing <maxDist> command\n");
1298                /* Make it look like these have been supplied */
1299                init[0] = init[2] = 1;
1300        }
1301  }
1302 
1303  /* After all files are closed, check init flags for missed commands */
1304  nmiss = 0;
1305  for (i = 0; i < NUMREQ; i++) 
1306    if (!init[i]) 
1307      nmiss++;
1308
1309  if (nmiss) 
1310  {
1311    fprintf(stderr, "gma: ERROR, no ");
1312    if (!init[0])  fprintf(stderr, "<staLoc> ");
1313    if (!init[1])  fprintf(stderr, "<maxSta> ");
1314    if (!init[2])  fprintf(stderr, "<maxDist> ");
1315    if (!init[3])  fprintf(stderr, "<maxTrace> ");
1316    if (!init[4])  fprintf(stderr, "<HeartBeatInterval> ");
1317    if (!init[5])  fprintf(stderr, "<RingInName> ");
1318    if (!init[6])  fprintf(stderr, "<RingOutName> ");
1319    if (!init[7])  fprintf(stderr, "<MyModId> ");
1320    if (!init[8])  fprintf(stderr, "<getEventsFrom> ");
1321   
1322    fprintf(stderr, "command(s) in <%s>; exitting!\n", configfile);
1323    return -1;
1324  }
1325
1326  /* Sort the SCNLPAR array to make searching more efficient */
1327  if (pgmParams->numSCNLPar > 0)
1328    qsort(pgmParams->pSCNLPar, pgmParams->numSCNLPar, sizeof(SCNLPAR), 
1329          CompareSCNLPARs);
1330
1331  /* If no spectra periods defined, use the old hard-coded ones */
1332  checkSRlist();
1333 
1334  return err;
1335}
1336
1337static void initGM(GMPARAMS *pgmParams)
1338{
1339  pgmParams->peakSearchStart = 0.0;
1340  pgmParams->peakSearchStartMin = 2.0;
1341  pgmParams->peakSearchEnd = 0.0;
1342  pgmParams->peakSearchEndMin = 30.0;
1343  pgmParams->traceStart = 5.0;
1344  pgmParams->traceEnd = 60.0; 
1345  pgmParams->pAdd = NULL;
1346  pgmParams->pDel = NULL;
1347  pgmParams->pSCNLPar = NULL;
1348  pgmParams->pWSV = NULL;      /* assign default "servers" file later */
1349  pgmParams->HeartBeatInterval = 0;
1350  pgmParams->debug = 0;
1351  pgmParams->maxSCNLPar = 0;
1352  pgmParams->maxSta = 0;
1353  pgmParams->numSCNLPar = 0;
1354  pgmParams->snrThresh = 3.0;
1355  pgmParams->respSource = GM_UNDEF;
1356  pgmParams->saveTrace = GM_UNDEF;
1357  pgmParams->staLoc = GM_UNDEF;
1358  pgmParams->traceSource = GM_UNDEF;
1359  pgmParams->wsTimeout = 5000; 
1360  pgmParams->eventID = NULL;
1361  pgmParams->respDir = NULL;
1362  pgmParams->respNameFormat = NULL;
1363  pgmParams->saveNameFormat = NULL;
1364  pgmParams->staLocFile = NULL;
1365  pgmParams->TempDir = NULL;
1366  pgmParams->XMLDir = NULL;
1367  pgmParams->MappingFile = NULL;
1368  pgmParams->pEW->nGetLogo = 0;
1369  pgmParams->pEW->GetLogo = (MSG_LOGO *)NULL;
1370  pgmParams->pEW->RingInKey = 0l;
1371  pgmParams->pEW->RingOutKey = 0l;
1372  pgmParams->pEW->ha2kLogo.type = 0;
1373  pgmParams->pEW->amLogo.type = 0;
1374  pgmParams->pEW->threshLogo.type = 0;
1375  pgmParams->preTriggerSeconds = 10;
1376  return;
1377}
1378
1379
Note: See TracBrowser for help on using the repository browser.