diff --git a/driveGnuPlots.pl b/driveGnuPlots.pl index 4275276..a6e4874 100755 --- a/driveGnuPlots.pl +++ b/driveGnuPlots.pl @@ -4,6 +4,12 @@ use Getopt::Long; use Time::HiRes qw( usleep ); use Data::Dumper; +# list containing the plot data. Each element is a hash describing the extra +# plotting options for each curve we're plotting, and the actual data to +# plot for each curve. The length of this list grows as the data comes +# in +my @curves = (); + # stream in the data by default # point plotting by default my %options = ( "stream" => 1, @@ -18,12 +24,14 @@ GetOptions(\%options, "ylabel=s", "y2label=s", "title=s", + "xlen=i", "ymin=f", "ymax=f", "y2min=f", "y2max=f", "y2=i@", - "hardcopy=s"); + "hardcopy=s", + "help"); # set up plotting style my $style = ""; @@ -35,12 +43,6 @@ if(!$style) { $style = "points"; } sub usage { print "Usage: $0 \n"; print <) { - chomp; - my $line = $_; - foreach my $point ($line =~ /$numRE/g) { - my $buf = $buffers[$streamIdx]; + foreach my $curve (@curves) + { + my $buf = $curve->{"data"}; + + # get the next datapoint, if there is one + my $point; + if(/($numRE)/gc) + { + $point = $1; + } + # if a point is not defined here, dup the last point we have if + # possible + elsif(@$buf) + { + $point = @$buf[$#$buf]; + } + # otherwise we can do nothing with this curve, so we skip it + else + { + next; + } # data buffering (up to stream sample size) - push @{$buf}, $point; - shift @{$buf} if(@{$buf} > $samples && $options{"stream"}); - - $streamIdx++; - if ($streamIdx == $numberOfStreams) { - $streamIdx = 0; - plotStoredData($xlast, $samples, $numberOfStreams, *PIPE, \@buffers, \@extraopts) if($options{"stream"}); - $xlast++; - } + push @$buf, $point; + shift @$buf if(@$buf > $samples && $options{"stream"}); } + + # if any extra data is available, create new curves for it + while(/($numRE)/gc) + { + newCurve("", "", $1); + } + + plotStoredData($xlast, $samples, *PIPE) if($options{"stream"}); + $xlast++; } if($options{"stream"}) @@ -183,8 +202,8 @@ sub main { } else { - $samples = @{$buffers[0]}; - plotStoredData($xlast, $samples, $numberOfStreams, *PIPE, \@buffers, \@extraopts); + $samples = @{$curves[0]->{"data"}}; + plotStoredData($xlast, $samples, *PIPE); if( defined $options{"hardcopy"}) { @@ -211,17 +230,20 @@ sub main { sub plotStoredData { - my ($xlast, $samples, $numberOfStreams, $pipe, $buffers, $extraopts) = @_; + my ($xlast, $samples, $pipe) = @_; my $x0 = $xlast - $samples + 1; print $pipe "set xrange [$x0:$xlast]\n"; - print $pipe 'plot ' . join(', ' , map({ "\"-\" $_"} @$extraopts) ) . "\n"; - foreach my $buf (@{$buffers}) + my @extraopts = map {$_->{"extraopts"}} @curves; + print $pipe 'plot ' . join(', ' , map({ '"-"' . $_} @extraopts) ) . "\n"; + + foreach my $curve (@curves) { + my $buf = $curve->{"data"}; # if the buffer isn't yet complete, skip the appropriate number of points - my $x = $x0 + $samples - @{$buf}; - for my $elem (@{$buf}) { + my $x = $x0 + $samples - @$buf; + for my $elem (@$buf) { print $pipe "$x $elem\n"; $x++; } @@ -229,5 +251,24 @@ sub plotStoredData } } +sub newCurve() +{ + my ($title, $opts, $newpoint) = @_; + if($title) { $opts = "title \"$title\" $opts" } + else { $opts = "notitle $opts" } + + my $data = []; + if (defined $newpoint) + { + my $numpoints = 1; + if (@curves) { + $numpoints = @{$curves[0]->{"data"}}; + } + $data = [($newpoint) x $numpoints] + } + push ( @curves, + {"extraopts" => " $opts", + "data" => $data} ); +} main;