#!/usr/bin/perl -w use strict; use Getopt::Long; use Data::Dumper; # stream in the data by default # point plotting by default my %options = ( "stream" => 1, "lines" => 0); GetOptions(\%options, "stream!", "lines!", "legend=s@", "xlabel=s", "ylabel=s", "y2label=s", "title=s", "y2min=f", "y2max=f", "y2=i@"); # set up plotting style my $style = "points"; $style = "linespoints" if($options{"lines"}); sub usage { print "Usage: $0 \n"; print <) { chomp; my $line = $_; foreach my $point ($line =~ /([-]?[0-9\.]+)/g) { my $buf = $buffers[$streamIdx]; # 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++; } } } if($options{"stream"}) { print PIPE "exit;\n"; close PIPE; } else { $samples = @{$buffers[0]}; plotStoredData($xlast, $samples, $numberOfStreams, *PIPE, \@buffers, \@extraopts); } sleep 100000; } sub plotStoredData { my ($xlast, $samples, $numberOfStreams, $pipe, $buffers, $extraopts) = @_; my $x0 = $xlast - $samples + 1; print $pipe "set xrange [$x0:$xlast]\n"; print $pipe 'plot ' . join(', ' , map({ "\"-\" $_"} @$extraopts) ) . "\n"; foreach my $buf (@{$buffers}) { # if the buffer isn't yet complete, skip the appropriate number of points my $x = $x0 + $samples - @{$buf}; for my $elem (@{$buf}) { print $pipe "$x $elem\n"; $x++; } print PIPE "e\n"; } } main;