realtime gnuplot driver: one window, multiple plots

darcs-hash:20090124005657-0cb85-b53c7089a73ae521f3417e1871d68f31bcb78f7b.gz
This commit is contained in:
Dima Kogan 2009-01-23 16:56:57 -08:00
parent 704c3f1607
commit cc96aac692

View File

@ -6,15 +6,9 @@ sub usage {
print <<OEF; print <<OEF;
where mandatory options are (in order): where mandatory options are (in order):
NumberOfStreams How many streams to plot (windows) NumberOfStreams How many streams to plot
Stream1_WindowSampleSize this many samples per window Stream_WindowSampleSize this many samples
<Stream2_WindowSampleSize> ...per stream2... Stream_YRangeMin Stream_YRangeMax Min and Max y values
...
<StreamN_WindowSampleSize> ...per streamN...
Stream1_YRangeMin Stream1_YRangeMax Min and Max values for stream 1
<Stream1_YRangeMin Stream1_YRangeMax> Min and Max values for stream 2
...
<StreamN_YRangeMin StreamN_YRangeMax> Min and Max values for stream N
OEF OEF
exit(1); exit(1);
@ -28,77 +22,82 @@ sub Arg {
$ARGV[int($_[0])]; $ARGV[int($_[0])];
} }
sub plotHeader
{
my ($xcounter, $samples, $numberOfStreams, $pipe) = @_;
#print "stream $streamIdx: ";
print $pipe "set xrange [".($xcounter-$samples).":".($xcounter+1)."]\n";
print $pipe 'plot ' . join(', ' , ('"-" notitle') x $numberOfStreams) . "\n";
}
sub main { sub main {
my $argIdx = 0; my $argIdx = 0;
my $numberOfStreams = Arg($argIdx++); my $numberOfStreams = Arg($argIdx++);
print "Will display $numberOfStreams Streams (in $numberOfStreams windows)...\n"; print "Will display $numberOfStreams Streams...\n";
my @sampleSizes;
for(my $i=0; $i<$numberOfStreams; $i++) {
my $samples = Arg($argIdx++); my $samples = Arg($argIdx++);
push @sampleSizes, $samples; print "Will use a window of $samples samples\n";
print "Stream ".($i+1)." will use a window of $samples samples\n";
}
my @ranges;
for(my $i=0; $i<$numberOfStreams; $i++) {
my $miny = Arg($argIdx++); my $miny = Arg($argIdx++);
my $maxy = Arg($argIdx++); my $maxy = Arg($argIdx++);
push @ranges, [ $miny, $maxy ]; print "Will use a range of [$miny, $maxy]\n";
print "Stream ".($i+1)." will use a range of [$miny, $maxy]\n";
}
my @gnuplots;
my @buffers; my @buffers;
shift @ARGV; # number of streams shift @ARGV; # number of streams
for(my $i=0; $i<$numberOfStreams; $i++) {
shift @ARGV; # sample size shift @ARGV; # sample size
shift @ARGV; # miny shift @ARGV; # miny
shift @ARGV; # maxy shift @ARGV; # maxy
local *PIPE; local *PIPE;
open PIPE, "|gnuplot" || die "Can't initialize gnuplot number ".($i+1)."\n";
open PIPE, "|gnuplot" || die "Can't initialize gnuplot\n";
select((select(PIPE), $| = 1)[0]); select((select(PIPE), $| = 1)[0]);
push @gnuplots, *PIPE;
print PIPE "set xtics\n"; print PIPE "set xtics\n";
print PIPE "set ytics\n"; print PIPE "set ytics\n";
print PIPE "set yrange [".($ranges[$i]->[0]).":".($ranges[$i]->[1])."]\n"; print PIPE "set yrange [". $miny . ":" . $maxy ."]\n";
print PIPE "set style data linespoints\n"; print PIPE "set style data points\n";
print PIPE "set grid\n"; print PIPE "set grid\n";
for(my $i=0; $i<$numberOfStreams; $i++) {
my @data = []; my @data = [];
push @buffers, @data; push @buffers, @data;
} }
my $streamIdx = 0; my $streamIdx = 0;
select((select(STDOUT), $| = 1)[0]); select((select(STDOUT), $| = 1)[0]);
my $xcounter = 0; my $xcounter = 0;
plotHeader($xcounter, $samples, $numberOfStreams, *PIPE);
while(<>) { while(<>) {
chomp; chomp;
my $line = $_;
foreach my $point ($line =~ /([-]?[0-9\.]+)/g)
{
my $buf = $buffers[$streamIdx]; my $buf = $buffers[$streamIdx];
my $pip = $gnuplots[$streamIdx];
# data buffering (up to stream sample size) # data buffering (up to stream sample size)
push @{$buf}, $_; push @{$buf}, $point;
#print "stream $streamIdx: ";
print $pip "set xrange [".($xcounter-$sampleSizes[$streamIdx]).":".($xcounter+1)."]\n";
print $pip "plot \"-\" notitle\n";
my $cnt = 0; my $cnt = 0;
for my $elem (reverse @{$buf}) { for my $elem (reverse @{$buf}) {
#print " ".$elem; #print " ".$elem;
print $pip ($xcounter-$cnt)." ".$elem."\n"; print PIPE ($xcounter-$cnt)." ".$elem."\n";
$cnt += 1; $cnt++;
} }
#print "\n"; #print "\n";
print $pip "e\n"; print PIPE "e\n";
if ($cnt>=$sampleSizes[$streamIdx]) { if ($cnt>=$samples) {
shift @{$buf}; shift @{$buf};
} }
$streamIdx++; $streamIdx++;
if ($streamIdx == $numberOfStreams) { if ($streamIdx == $numberOfStreams) {
$streamIdx = 0; $streamIdx = 0;
$xcounter++; $xcounter++;
plotHeader($xcounter, $samples, $numberOfStreams, *PIPE);
} }
} }
for(my $i=0; $i<$numberOfStreams; $i++) {
my $pip = $gnuplots[$i];
print $pip "exit;\n";
close $pip;
} }
print PIPE "exit;\n";
close PIPE;
} }
main; main;