source: trunk/src/diagnostic_tools/sniffwave/sniffwave.c @ 2832

Revision 2832, 15.4 KB checked in by stefan, 12 years ago (diff)

Earthworm Class March 2007, added statistics flag to sniffwave, y, n, or s options are now handled, tport fix made

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1
2/*
3 *
4 *    $Id$
5 *
6 *    Revision history:
7 *     $Log$
8 *     Revision 1.19  2007/03/23 15:53:15  stefan
9 *     Earthworm Class March 2007, added statistics flag to sniffwave, y, n, or s options are now handled, tport fix made
10 *
11 *     Revision 1.18  2007/02/07 00:35:16  stefan
12 *     help text revision
13 *
14 *     Revision 1.17  2007/02/02 19:06:59  stefan
15 *     removed module verbosity for non-local modules
16 *
17 *     Revision 1.16  2006/12/28 23:07:54  lombard
18 *     Added version number, printed with usage.
19 *     Changed to specifically look for TYPE_TRACEBUF2 and TYPE_TRACE2_COMP_UA
20 *     packets if SCNL given on command line, or to look for TYPE_TRACEBUF and
21 *     TYPE_TRACE_COMP_UA packets if SCN is given on command line. Thus you cannot
22 *     sniff for both SCNL and SCN packets at once with this command.
23 *
24 *     Revision 1.15  2006/12/01 02:12:58  stefan
25 *     Added "verbose" option to print module, installation and type names along
26 *     with the numbers. Without this extra parameter it works as before.
27 *
28 *     Revision 1.14  2006/07/26 20:23:00  stefan
29 *     additional significant digits for sample rates < 1hz
30 *
31 *     Revision 1.13  2006/03/27 16:57:27  davek
32 *     Added version and quality info to the sniffwave output for each tracebuf.
33 *
34 *     Revision 1.12  2005/03/30 23:13:26  dietz
35 *     Now printing seconds to 4 decimal places.
36 *
37 *     Revision 1.11  2004/04/13 22:57:32  dietz
38 *     modified to work with TYPE_TRACEBUF2 and TYPE_TRACE2_COMP_UA msgs
39 *
40 *     Revision 1.10  2003/10/31 17:20:43  dietz
41 *     Will now sniff both TYPE_TRACEBUF and TYPE_TRACE_COMP_UA msg headers.
42 *     Will accept strings "wild", "WILD", and "*" as wildcards in SCN.
43 *
44 *     Revision 1.9  2002/10/24 22:11:32  dietz
45 *     Added message length to printed information
46 *
47 *     Revision 1.8  2002/07/12 17:49:57  dietz
48 *     added #include <time_ew.h>
49 *
50 *     Revision 1.7  2002/02/02 00:28:58  dietz *     Changed to print instid and module on the tracebuf header summary line
51 *
52 *     Revision 1.6  2001/03/30 01:17:36  dietz
53 *     *** empty log message ***
54 *
55 *     Revision 1.5  2001/03/30 01:10:18  dietz
56 *     added newline after every 10 data samples, and an fflush(stdout)
57 *     after each tracebuf message.
58 *
59 *     Revision 1.4  2001/03/29 23:51:03  dietz
60 *     Changed ring flush statemnet to while( tport_get... != GET_NONE );
61 *
62 *     Revision 1.3  2000/08/08 18:18:28  lucky
63 *     Lint cleanup
64 *
65 *     Revision 1.2  2000/05/31 18:29:10  dietz
66 *     Fixed to print 4-byte data properly.
67 *
68 *     Revision 1.1  2000/02/14 19:36:09  lucky
69 *     Initial revision
70 *
71 *
72 */
73
74
75  /*****************************************************************
76   *                            sniffwave.c                        *
77   *                                                               *
78   * Program to read waveform messages from shared memory and      *
79   * write to a disk file.                                         *
80   *                                                               *
81   * Modified by Lucky Vidmar Tue May 11 11:27:35 MDT 1999         *
82   *   allows for more arguments which specify                     *
83   *     Ring to read from                                         *
84   *     SCN of the messages to print                              *
85   *     Whether or not trace data should be printed               *
86   *                                                               *
87   *                                                               *
88   * Usage: sniffwave  <Ring> <Sta> <Comp> <Net> <Loc> <Data y/n>  *
89   *    or: sniffwave  <Ring> <Sta> <Comp> <Net> <Data y/n>        *
90   *                                                               *
91   *****************************************************************/
92
93
94#include <stdio.h>
95#include <string.h>
96#include <stdlib.h>
97#include <math.h>
98#include <transport.h>
99#include <swap.h>
100#include <time_ew.h>
101#include <trace_buf.h>
102#include <earthworm.h>
103
104#define NLOGO 4
105#define VERSION "2.2"
106
107int IsWild( char *str )
108{
109  if( (strcmp(str,"wild")==0)  ) return 1;
110  if( (strcmp(str,"WILD")==0)  ) return 1;
111  if( (strcmp(str,"*")   ==0)  ) return 1;
112  return 0;
113}
114
115int main( int argc, char **argv )
116{
117   SHM_INFO        region;
118   long            RingKey;         /* Key to the transport ring to read from */
119   MSG_LOGO        getlogo[NLOGO], logo;
120   long            gotsize;
121   char            msg[MAX_TRACEBUF_SIZ];
122   char           *getSta, *getComp, *getNet, *getLoc, *inRing;
123   char            wildSta, wildComp, wildNet, wildLoc;
124   unsigned char   Type_TraceBuf,Type_TraceBuf2;
125   unsigned char   Type_TraceComp, Type_TraceComp2;
126   unsigned char   InstWildcard, ModWildcard;
127   short          *short_data;
128   long           *long_data;
129   TRACE2_HEADER  *trh;
130   char            stime[256];
131   char            etime[256];
132   int             dataflag;
133   int             i;
134   int             rc;
135   int             verbose = 0; /* if verbose =1 print name and number for logo ids */
136   int             useLoc = 0;
137   int             nLogo = NLOGO;
138   static unsigned char InstId;        /* local installation id              */
139   char            ModName[MAX_MOD_STR];
140   unsigned char   sequence_number = 0;
141   int             statistics_flag;
142
143  /* Initialize pointers
144  **********************/
145  trh  = (TRACE2_HEADER *) msg;
146  long_data  =  (long *)( msg + sizeof(TRACE2_HEADER) );
147  short_data = (short *)( msg + sizeof(TRACE2_HEADER) );
148
149  /* Check command line argument
150  *****************************/
151  if ( argc < 6 || argc > 8 )
152  {
153     fprintf(stderr, "%s version %s\n", argv[0], VERSION);
154     fprintf(stderr,"Usage: %s <ring name> <station> <component> <network> [<loc>] <y/n/s> [v]\n", argv[0]);
155     fprintf(stderr, "\n       Appending the optional \"v\" or \"verbose\" argument causes module, \n");
156     fprintf(stderr, "       installation and type names to be printed in addition to usual ID numbers\n");
157     fprintf(stderr, "\n       The <y/n/s> flag is a data flag. If 'y' is specified, the full data\n");
158     fprintf(stderr, "       contained in the tracebuf or tracebuf2 packet is printed out. \n");
159     fprintf(stderr, "       If the flag is set to s, provide max/min/avg statistics of the trace data. \n");
160     fprintf(stderr, "\n       If you specify the location code or wild for the location code\n");
161     fprintf(stderr, "       you'll get Tracebuf2 packets. Otherwise you'll get Tracebufs.\n");
162     fprintf(stderr,"\nExample: %s WAVE_RING PHOB wild NC wild n\n", argv[0] );
163     fprintf(stderr,"Example: %s WAVE_RING wild wild wild y verbose\n", argv[0] );
164     exit( 1 );
165  }
166  inRing  = argv[1];
167  getSta  = argv[2];
168  wildSta  = IsWild( getSta  );
169  getComp = argv[3];
170  wildComp = IsWild( getComp );
171  getNet  = argv[4];
172  wildNet  = IsWild( getNet  );
173
174  if (strcmp(argv[argc-1], "verbose") == 0) {
175      argc--;
176      verbose = 1;
177  }
178
179  if (argc == 7 ) {
180      getLoc  = argv[5];
181      useLoc = 1;
182      wildLoc  = IsWild( getLoc  );
183      fprintf(stdout, "Sniffing %s for %s.%s.%s.%s\n",
184          inRing, getSta, getComp, getNet, getLoc);
185
186  } else {
187      getLoc = NULL;
188      nLogo = 2;
189      wildLoc = 0;
190      fprintf(stdout, "Sniffing %s for %s.%s.%s\n",
191          inRing, getSta, getComp, getNet);
192  }
193
194  dataflag=0;
195  statistics_flag=0;
196  if(strcmp (argv[5 + useLoc], "y") == 0)
197     dataflag = 1;
198  else if(strcmp (argv[5 + useLoc], "n") == 0)
199     dataflag = 0;
200  else if(strcmp (argv[5 + useLoc], "s") == 0)
201     statistics_flag = 1;
202  else
203  {
204    fprintf(stderr, "sniffwave: specify data flag - y or n or s\n");
205    exit (1);
206  }
207
208  /* Open log file
209  ****************/
210  logit_init( "sniffwave", 99, 100, 1 );
211
212  /* Attach to ring
213  *****************/
214  if ((RingKey = GetKey( inRing )) == -1 )
215  {
216    logit( "e", "Invalid RingName; exiting!\n" );
217    exit( -1 );
218  }
219  tport_attach( &region, RingKey );
220
221/* Look up local installation id
222   *****************************/
223   if ( GetLocalInst( &InstId ) != 0 )
224   {
225      printf( "sniffwave: error getting local installation id; exiting!\n" );
226      return -1;
227   }
228
229
230  /* Specify logos to get
231  ***********************/
232  if ( GetType( "TYPE_TRACEBUF", &Type_TraceBuf ) != 0 ) {
233     logit("e","%s: Invalid message type <TYPE_TRACEBUF>!\n", argv[0] );
234     exit( -1 );
235  }
236  if ( GetType( "TYPE_TRACE_COMP_UA", &Type_TraceComp ) != 0 ) {
237     logit("e","%s: Invalid message type <TYPE_TRACE_COMP_UA>!\n", argv[0] );
238     exit( -1 );
239  }
240  if ( GetType( "TYPE_TRACEBUF2", &Type_TraceBuf2 ) != 0 ) {
241     logit("e","%s: Invalid message type <TYPE_TRACEBUF2>!\n", argv[0] );
242     exit( -1 );
243  }
244  if ( GetType( "TYPE_TRACE2_COMP_UA", &Type_TraceComp2 ) != 0 ) {
245     logit("e","%s: Invalid message type <TYPE_TRACE2_COMP_UA>!\n", argv[0] );
246     exit( -1 );
247  }
248  if ( GetModId( "MOD_WILDCARD", &ModWildcard ) != 0 ) {
249     logit("e","%s: Invalid moduleid <MOD_WILDCARD>!\n", argv[0] );
250     exit( -1 );
251  }
252  if ( GetInst( "INST_WILDCARD", &InstWildcard ) != 0 ) {
253     logit("e","%s: Invalid instid <INST_WILDCARD>!\n", argv[0] );
254     exit( -1 );
255  }
256
257  for( i=0; i<nLogo; i++ ) {
258      getlogo[i].instid = InstWildcard;
259      getlogo[i].mod    = ModWildcard;
260  }
261  getlogo[0].type = Type_TraceBuf;
262  getlogo[1].type = Type_TraceComp;
263  if (useLoc) {
264      getlogo[2].type = Type_TraceBuf2;
265      getlogo[3].type = Type_TraceComp2;
266  }
267
268  /* Flush the ring
269  *****************/
270  while ( tport_getmsg( &region, getlogo, nLogo, &logo, &gotsize,
271            (char *)&msg, MAX_TRACEBUF_SIZ ) != GET_NONE );
272  logit( "et", "sniffwave: inRing flushed.\n");
273
274  while ( tport_getflag( &region ) != TERMINATE )
275  {
276    rc = tport_copyfrom( &region, getlogo, nLogo,
277               &logo, &gotsize, msg, MAX_TRACEBUF_SIZ, &sequence_number );
278
279    if ( rc == GET_NONE )
280    {
281      sleep_ew( 200 );
282      continue;
283    }
284
285    if ( rc == GET_TOOBIG )
286    {
287      logit( "et", "sniffwave: retrieved message too big (%d) for msg\n",
288        gotsize );
289      continue;
290    }
291
292    if ( rc == GET_NOTRACK )
293      logit( "et", "sniffwave: Tracking error.\n");
294
295    if ( rc == GET_MISS_LAPPED )
296      logit( "et", "sniffwave: Got lapped on the ring.\n");
297
298    if ( rc == GET_MISS_SEQGAP )
299      logit( "et", "sniffwave: Gap in sequence numbers\n");
300
301    if ( rc == GET_MISS )
302      logit( "et", "sniffwave: Missed messages\n");
303
304    /* Check SCNL of the retrieved message */
305
306    if ( (wildSta  || (strcmp(getSta,trh->sta)  ==0)) &&
307         (wildComp || (strcmp(getComp,trh->chan)==0)) &&
308         (wildNet  || (strcmp(getNet,trh->net)  ==0)) &&
309         ((useLoc && (logo.type == Type_TraceBuf2 ||
310          logo.type == Type_TraceComp2) &&
311         (wildLoc  || (strcmp(getLoc,trh->loc) == 0))) ||
312         (! useLoc && ( logo.type == Type_TraceBuf ||
313             logo.type == Type_TraceComp))))
314    {
315      WaveMsg2MakeLocal( trh );
316
317      datestr23 (trh->starttime, stime, 256);
318      datestr23 (trh->endtime,   etime, 256);
319
320      if( logo.type == Type_TraceBuf2  ||
321          logo.type == Type_TraceComp2    ) {
322          fprintf( stdout, "%s.%s.%s.%s (0x%x 0x%x) ",
323                   trh->sta, trh->chan, trh->net, trh->loc, trh->version[0], trh->version[1] );
324      } else {
325          fprintf( stdout, "%s.%s.%s ",
326                   trh->sta, trh->chan, trh->net );
327      }
328      if (trh->samprate < 1.0) { /* more decimal places for slower sample rates */
329          fprintf( stdout, "%d %s %d %6.4f %s (%.4f) %s (%.4f) %c%c \n",
330               trh->pinno, trh->datatype, trh->nsamp, trh->samprate,
331               stime, trh->starttime,
332               etime, trh->endtime, trh->quality[0], trh->quality[1] );
333      } else {
334          fprintf( stdout, "%d %s %d %.1f %s (%.4f) %s (%.4f) %c%c ",
335                         trh->pinno, trh->datatype, trh->nsamp, trh->samprate,
336                         stime, trh->starttime,
337                         etime, trh->endtime, trh->quality[0], trh->quality[1] );
338      }
339      if (verbose) {
340
341          if (InstId == logo.instid) {
342              sprintf( ModName, "%s", GetModIdName(logo.mod));
343          } else {
344              sprintf( ModName, "UnknownRemoteMod");
345          }
346
347          fprintf( stdout, "i%d=%s m%d=%s t%d=%s len%d\n",
348                 (int)logo.instid, GetInstName(logo.instid), (int)logo.mod,
349                 ModName, (int)logo.type, GetTypeName(logo.type), gotsize );
350      } else {
351          fprintf( stdout, "i%d m%d t%d len%d\n",
352                 (int)logo.instid, (int)logo.mod, (int)logo.type, gotsize );
353      }
354
355      if (dataflag == 1)
356      {
357        if( logo.type == Type_TraceBuf2 ||
358            logo.type == Type_TraceBuf     )
359        {
360          if ( (strcmp (trh->datatype, "s2")==0) ||
361               (strcmp (trh->datatype, "i2")==0)    )
362          {
363            for ( i = 0; i < trh->nsamp; i++ ) {
364              fprintf ( stdout, "%6hd ", *(short_data+i) );
365              if(i%10==9) fprintf ( stdout, "\n" );
366            }
367          }
368          else if ( (strcmp (trh->datatype, "s4")==0) ||
369                    (strcmp (trh->datatype, "i4")==0)    )
370          {
371            for ( i = 0; i < trh->nsamp; i++ ) {
372              fprintf ( stdout, "%6ld ", *(long_data+i) );
373              if(i%10==9) fprintf ( stdout, "\n" );
374            }
375          }
376          else
377          {
378             fprintf (stdout, "Unknown datatype %s\n", trh->datatype);
379          }
380        } else {
381             fprintf (stdout, "Data values compressed\n");
382        }
383        fprintf (stdout, "\n");
384        fflush (stdout);
385      }
386      if (statistics_flag == 1)
387      {
388        if( logo.type == Type_TraceBuf2 ||
389            logo.type == Type_TraceBuf     )
390        {
391          long max=0;
392          long min=0;
393          double avg=0.0;
394          short short_value;
395          long long_value;
396
397          if ( (strcmp (trh->datatype, "s2")==0) ||
398               (strcmp (trh->datatype, "i2")==0)    )
399          {
400            for ( i = 0; i < trh->nsamp; i++ ) {
401              short_value = *(short_data+i);
402              if (short_value > max || max == 0) {
403                max=short_value;
404              }
405              if (short_value < min || min == 0) {
406                min=short_value;
407              }
408              avg += short_value;
409            }
410            avg = avg / trh->nsamp;
411            fprintf(stdout, "Raw Data statistics max=%ld min=%ld avg=%f\n",
412                       max, min, avg); 
413            fprintf(stdout, "DC corrected statistics max=%f min=%f spread=%ld\n\n",
414                       (double)(max - avg), (double)(min - avg), 
415                       labs(max - min)); 
416          }
417          else if ( (strcmp (trh->datatype, "s4")==0) ||
418                    (strcmp (trh->datatype, "i4")==0)    )
419          {
420            for ( i = 0; i < trh->nsamp; i++ ) {
421              long_value = *(long_data+i);
422              if (long_value > max || max == 0) {
423                max=long_value;
424              }
425              if (long_value < min || min == 0) {
426                min=long_value;
427              }
428              avg += long_value;
429            }
430            avg = avg / trh->nsamp;
431            fprintf(stdout, "Raw Data statistics max=%ld min=%ld avg=%f\n",
432                       max, min, avg); 
433            fprintf(stdout, "DC corrected statistics max=%f min=%f spread=%ld\n\n",
434                       (double)(max - avg), (double)(min - avg), 
435                       labs(max - min)); 
436          }
437          else
438          {
439             fprintf (stdout, "Unknown datatype %s\n", trh->datatype);
440          }
441        } else {
442             fprintf (stdout, "Data values compressed\n");
443        }
444        fflush (stdout);
445       } /* end of statistics_flag if */
446      } /* end of process this tracebuf if */
447     } /* end of infinite while loop */
448
449  exit (0);
450}
451
Note: See TracBrowser for help on using the repository browser.