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

Revision 3180, 15.6 KB checked in by paulf, 11 years ago (diff)

fixed sniffwave to handle systems where long could be 8 bytes

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