5 print "Usage: $0 <options>\n";
7 where options are (in order):
9 NumberOfStreams How many streams to plot (windows)
10 Stream1_WindowSampleSize <Stream2...> This many window samples for each stream
11 Stream1_Title <Stream2_Title> ... Title used for each stream
12 (Optional) Stream1_geometry <Stream2_geometry>... X and Y position in pixels from the top left
14 The last parameters (the optionally provided geometries of the gnuplot windows)
16 WIDTHxHEIGHT+XOFF+YOFF
23 print "Expected parameter missing...\n\n";
31 my $numberOfStreams = Arg($argIdx++);
32 print "Will display $numberOfStreams Streams (in $numberOfStreams windows)...\n";
34 for(my $i=0; $i<$numberOfStreams; $i++) {
35 my $samples = Arg($argIdx++);
36 push @sampleSizes, $samples;
37 print "Stream ".($i+1)." will use a window of $samples samples\n";
40 for(my $i=0; $i<$numberOfStreams; $i++) {
41 my $title = Arg($argIdx++);
43 print "Stream ".($i+1)." will use a title of '$title'\n";
46 if ($#ARGV >= $argIdx) {
47 for(my $i=0; $i<$numberOfStreams; $i++) {
48 my $geometry = Arg($argIdx++);
49 push @geometries, $geometry;
50 print "Stream ".($i+1)." will use a geometry of '$geometry'\n";
54 open GNUPLOT_TERM, "echo 'show terminal;' | gnuplot 2>&1 |";
55 while (<GNUPLOT_TERM>) {
56 if (m/terminal type is (\w+)/) {
62 # unfortunately, the wxt terminal type does not support positioning.
68 my $x_space = 5; # gnuplot needs some space
75 my ($x_size, $y_size) = ( 1,1 );
77 foreach my $title (@titles) {
78 if ( $title =~ m/,$/ ) {
79 $y_size = $vertical if $vertical > $y_size;
87 $y_size = $vertical if $vertical > $y_size;
88 print "# grid $x_size x $y_size\n";
90 my $info = `xwininfo -root`;
91 if ( $info =~ m/-geometry (\d+)x(\d+)/ ) {
92 my ( $x_screen, $y_screen ) = ( $1, $2 );
93 $w = int( ( $x_screen - ( 2 * $x_start ) - ( ($x_size-1) * $x_space ) ) / $x_size );
94 $h = int( ( $y_screen - ( 2 * $y_start ) - ( ($y_size-1) * $y_space ) ) / $y_size );
95 print "# graph size $w x $h\n";
102 shift @ARGV; # number of streams
103 for(my $i=0; $i<$numberOfStreams; $i++) {
104 shift @ARGV; # sample size
106 shift @ARGV; # geometry
109 my $geometry = "${w}x${h}+${x}+${y}";
110 $geometries[$i] = $geometry;
111 print "# $i $titles[$i] $geometry\n";
112 $geometry = " -geometry $geometry";
114 if ( $titles[$i] =~ s/,$// ) {
121 open PIPE, "|gnuplot $geometry " || die "Can't initialize gnuplot number ".($i+1)."\n";
122 select((select(PIPE), $| = 1)[0]);
123 push @gnuplots, *PIPE;
124 print PIPE "set xtics\n";
125 print PIPE "set ytics\n";
126 # print PIPE "set style data linespoints\n";
127 print PIPE "set style data lines\n";
128 print PIPE "set grid\n";
129 if ($numberOfStreams == 1) {
130 print PIPE "set terminal $terminal title '".$titles[0]."' noraise\n";
132 print PIPE "set terminal $terminal noraise\n";
134 print PIPE "set autoscale\n";
136 push @buffers, @data;
140 select((select(STDOUT), $| = 1)[0]);
143 my @parts = split /:/;
144 $streamIdx = $parts[0];
145 my $buf = $buffers[$streamIdx];
146 my $pip = $gnuplots[$streamIdx];
147 my $xcounter = $xcounters[$streamIdx];
148 my $title = $titles[$streamIdx];
150 # data buffering (up to stream sample size)
151 push @{$buf}, $parts[1];
152 #print "stream $streamIdx: ";
153 print $pip "set xrange [".($xcounter-$sampleSizes[$streamIdx]).":".($xcounter+1)."]\n";
154 if ($numberOfStreams == 1) {
155 print $pip "plot \"-\"\n";
157 print $pip "plot \"-\" title '$title'\n";
160 for my $elem (reverse @{$buf}) {
162 print $pip ($xcounter-$cnt)." ".$elem."\n";
167 if ($cnt>=$sampleSizes[$streamIdx]) {
170 $xcounters[$streamIdx]++;
172 for(my $i=0; $i<$numberOfStreams; $i++) {
173 my $pip = $gnuplots[$i];
174 print $pip "exit;\n";